JAVA 网络编程

1. ip地址


        //查询本机地址
        InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
        System.out.println(inetAddress1);
        InetAddress inetAddress2 = InetAddress.getByName("localhost");
        System.out.println(inetAddress2);
        InetAddress inetAddress3 = InetAddress.getLocalHost();
        System.out.println(inetAddress3);

        //查询网络ip地址
        InetAddress inetAddress4 = InetAddress.getByName("www.baidu.com");
        System.out.println(inetAddress4);
        
        //常用方法
        //1,获取ip
        System.out.println(inetAddress4.getHostAddress());
        //2.获取域名
        System.out.println(inetAddress4.getHostName());


/*        /127.0.0.1
        localhost/127.0.0.1
        DESKTOP-RS7MPP1/169.254.131.248
        www.baidu.com/112.80.248.75
        112.80.248.75
        www.baidu.com
        */

2. 端口

单个协议下端口号不能冲突
端口分类
1. 公有端口 : 0~1023
HTTP:80
HTTPS:443
2. 程序注册端口: 1024~49151
MySQL:3306
3. 动态,私有: 49152~65535(不用)


3. 套接字

ip地址加端口号

在这里插入图片描述


4. 简单的客户端服务器(TCP)

4.1客户端

  1. 连接服务器socket
  2. 发送信息
//客户端
public class Client {
    public static void main(String[] args) throws Exception {
        //建立套接字,连接服务器(获取服务器的套接字)

        //1.获取ip(此时服务器ip就是主机ip)
        InetAddress inetAddress = InetAddress.getLocalHost();
        //2.获取端口号
        int port = 9999;
        //3.生成套接字
        Socket socket = new Socket(inetAddress,port);

/*        //发送消息(使用DataOutputStream输出流)
        DataOutputStream out =new DataOutputStream(socket.getOutputStream());
        out.writeUTF("nihao");*/

        //发送消息
        OutputStream out = socket.getOutputStream();
        out.write("nihaonihao".getBytes());

        //传输完毕
        socket.shutdownOutput();

    }
}

4.2服务端

  1. 创建ServerSocket
  2. 监听客户端接入accept()
  3. 接受处理用户信息
//服务器端
public class Server {

    public static void main(String[] args) throws IOException {
        //建立服务器端套接字(自动获取ip)
        ServerSocket serverSocket = new ServerSocket(9999);
        //监听客户端连接
        Socket socket = serverSocket.accept();  //此时的socket就是客户端的socket

        /*
        //读取客户端消息(使用DataInputStream输入流)
        DataInputStream in = new DataInputStream(socket.getInputStream());
        try {
            while (true)
            {
                if (in == null) break;
                String s= (in.readUTF());
                System.out.println(s);
            }
        }catch (IOException e)
        {
        }*/

        //读取客户端消息
        //管道流
        InputStream in = socket.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while( true)
        {
            if((len=in.read(buffer))== -1)
                break;
            baos.write(buffer, 0, len);   //in的值读到buffer中再写给baos
        }
        socket.shutdownInput();//接受完毕
        System.out.println(baos.toString());
    }
}

5. UDP

UDP无需建立连接就可以发送,重点在于建立发送的的目的地的ip,端口,和发送数据的包。

5.1.建立端口

 DatagramSocket socket = new DatagramSocket(3000);

5.2.建立数据包

发送数据时实例化DatagramPacket对象 需要
(1)储存数据的字节数组(2)起始位置(3)数组长度(4)目的地址(5)目的端口号

 DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length, InetAddress.getLocalHost(),6666);

接受数据时实例化DatagramPacket对象需要
(1)储存数据的字节数组(2)起始位置(3)数组长度

 DatagramPacket packet = new DatagramPacket(bytes,0,1024);

5.3.发送包或接收包

socket.send(packet);	//发送
socket.receive(packet);		//接受

5.4简单的UDP实列

UDP并不存在客户端和服务端,此处只是一个代码只实现了发送或接受的功能

5.4.1客户端

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

public class UdpClient {
    public static void main(String[] args) throws Exception {
        //1.建立端口
        DatagramSocket socket = new DatagramSocket(3000);
        
        while(true)
        {
            //2.建立发送数据的包
            byte[] bytes = new byte[1024];  //储存数据
            Scanner scanner = new Scanner(System.in);
            String data = scanner.next();
            bytes = data.getBytes();

            //发送数据时实例化DatagramPacket对象
            // 需要(1)储存数据的字节数组(2)起始位置(3)数组长度(4)目的地址(5)目的端口号
            DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length, InetAddress.getLocalHost(),6666);

            //3.发送包
            socket.send(packet);
            if(data.equals("bye"))
                break;;
        }

        //4.关闭
        socket.close();

    }
}

5.4.2 服务器端

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpSereve{
    public static void main(String[]args) throws Exception {
        //1/建立端口
        DatagramSocket socket = new DatagramSocket(6666);
        while (true)
        {
            //2。建立接受数据的包
            byte[] bytes= new byte[1024];

            //接受数据时实例化DatagramPacket对象
            // 需要(1)储存数据的字节数组(2)起始位置(3)数组长度
            DatagramPacket packet = new DatagramPacket(bytes,0,1024);

            //3.接受数据
            socket.receive(packet);
            //获取的数据为字节数组类型,转换成string类型再输出
            String str = new String(packet.getData(),0, packet.getLength());
            System.out.println(str);
            if(str.equals("bye"))
                break;
        }


        //4.关闭
        socket.close();

    }

}

6. UDP实现多线程沟通

思路:
将客户端和服务器构造成两个线程,此时一个用户就可以同时开启这个两个线程,做到沟通的效果(既可以发也可以收)当然想要沟通需要两个用户

6.1 客户端线程

客户端发送信息,所以需要(1)自身的发送端口,(2)发送目的地ip(3)发送目的地端口

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class Client implements  Runnable{

    //(1)自身的发送端口,(2)发送目的地ip(3)发送目的地端口
    int fromPort;
    InetAddress toIp;
    int toPort;

    public Client(int fromPort, InetAddress toIp, int toPort) {
        this.fromPort = fromPort;
        this.toIp = toIp;
        this.toPort = toPort;
    }

    @Override
    public void run() {
        try {
            //1.建立端口
            DatagramSocket socket = new DatagramSocket(fromPort);

            while(true)
            {
                //2.建立发送数据的包
                byte[] bytes = new byte[1024];  //储存数据
                Scanner scanner = new Scanner(System.in);
                String data = scanner.next();
                bytes = data.getBytes();

                //发送数据时实例化DatagramPacket对象
                // 需要(1)储存数据的字节数组(2)起始位置(3)数组长度(4)目的地址(5)目的端口号
                DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length, toIp,toPort);

                //3.发送包
                socket.send(packet);
                if(data.equals("bye"))
                    break;;
            }

            //4.关闭
            socket.close();
        }catch (Exception e)
        {
        }

    }
}

6.2 服务器端线程

服务器端接受信息,所以需要(1)自身的接收端口

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Server implements Runnable{
    //(1)自身的接收端口
    int fromPort;

    public Server(int fromPort) {
        this.fromPort = fromPort;
    }

    @Override
    public void run() {
        try {
            //1/建立端口
            DatagramSocket socket = new DatagramSocket(fromPort);
            while (true)
            {
                //2。建立接受数据的包
                byte[] bytes= new byte[1024];

                //接受数据时实例化DatagramPacket对象
                // 需要(1)储存数据的字节数组(2)起始位置(3)数组长度
                DatagramPacket packet = new DatagramPacket(bytes,0,1024);

                //3.接受数据
                socket.receive(packet);
                //获取的数据为字节数组类型,转换成string类型再输出
                String str = new String(packet.getData(),0, packet.getLength());
                System.out.println(str);
                if(str.equals("bye"))
                    break;
            }


            //4.关闭
            socket.close();
        }catch (Exception e)
        {
        }

    }
}

6.3 用户

import java.net.InetAddress;
import java.net.UnknownHostException;

public class User1 {
    public static void main(String[] args) throws UnknownHostException {
        new Thread(new Client(3333, InetAddress.getByName("127.0.0.1"),6666)).start();
        new Thread(new Server(7777)).start();
    }
}
import java.net.InetAddress;
import java.net.UnknownHostException;

public class User2 {
    public static void main(String[] args) throws UnknownHostException {
        new Thread(new Client(4444, InetAddress.getByName("127.0.0.1"),7777)).start();
        new Thread(new Server(6666)).start();
    }
}


7. URL

7.1 URL简介

统一资源定位符,可以定位互联网中的某一个资源

五部分组成:(可以少,但是不能多)
协议://ip地址:端口/项目名/资源

import java.net.MalformedURLException;
import java.net.URL;

public class Url {
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://localhost:3333/hello/hello.txt");

        System.out.println(url.getProtocol());  //获取协议
        System.out.println(url.getHost());  //获取主机ip
        System.out.println(url.getPort());  //获取端口号
        System.out.println(url.getPath());     //获取文件名

/*      http
        localhost
        3333
        /hello/hello.txt   */
    }
}

7.2 通过URL下载资源

1.建立下载地址

2.连接下载地址

3.IO流获取内容(注:要根据获取资源修改生成文件的格式)

public class UrlDown {
    public static void main(String[] args) throws Exception {
        //下载地址
        URL url = new URL("https://p2.music.126.net/A6VByArTeykL0EkmBzGv_A==/109951166183733920.jpg?param=200y200");

        //连接到这个资源
        URLConnection urlConnection = url.openConnection();

        InputStream inputStream = urlConnection.getInputStream();

        FileOutputStream fileOutputStream = new FileOutputStream("a.jpg");

        byte[] buffer = new byte[1024];
        int len;
        while ((len=inputStream.read(buffer))!=-1)
        {
            fileOutputStream.write(buffer,0,len);
        }
    }
}

版权声明:本文为fanfanfanfan2022原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。