网络编程

网络编程

概念

利用通信线路和通信设备,把多台计算机连接起来,利用软件实现资源共享,数据传输,构成计算机网络系统

IP地址

区分每一台电脑,通过对方主机IP地址进行访问

分支

IPv4 32个比特位 表示地址数量2^32

0.0.0.0~255.255.255.255 00000000.00000000.00000000.00000000~11111111.11111111.11111111.11111111

IPv6 128个比特位 表示地址数量2^128 (16^32)

可以表示更多的IP地址

端口号

区分每一个程序,通过IP:端口访问其他计算机每一个应用程序服务,端口号 0~65535 之间的值

TCP

两台计算机通信,可靠且畅通(三次握手,四次挥手),保证正确收发数据,TCP适合一些可靠的数据传输场景

UDP

无连接通信,不可靠,可能数据丢失,简单高效

三次握手,四次挥手

详细解答:

“三次握手,四次挥手”你真的懂吗? - 知乎 (zhihu.com)

Socket 技术

套接字,是计算机之间进行通信一种约定或一种方式,支持TCP/UDP

Socket 代码实现

连接

class Server{
    public static void main(String[] args) throws Exception{
        new ServerSocket(8080).accept();
        System.out.println("连接成功");
    }
}

class Client{
    public static void main(String[] args) throws Exception{
        new Socket("localhost",8080);
    }
}

循环连接

class Server{
    public static void main(String[] args) throws Exception{
        ServerSocket socket = new ServerSocket(8080);
        while (true){
            socket.accept();
            System.out.println("连接成功");
        }
    }
}

class Client{
    public static void main(String[] args) throws Exception{
        new Socket("localhost",8080);
    }
}

传输数据

Client -> Server

public class Server {
    public static void main(String[] args) throws Exception{
        Socket socket = new ServerSocket(8080).accept();
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println(reader.readLine());
        socket.close();
        reader.close();
    }
}

public class Client {
    public static void main(String[] args) throws Exception{
        Socket socket = new Socket("localhost", 8080);
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        writer.write("hello,world");
        writer.flush();
        writer.close();
        socket.close();
    }
}

双向传输数据

public class Server {
    public static void main(String[] args) {
        try(ServerSocket server = new ServerSocket(8080)){
            Socket socket = server.accept();
            socket.setKeepAlive(true);// 防止连接双方通知不到对方,占用资源
            socket.setSoTimeout(5000); //服务器等待的超时时间 -> 5秒
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println(reader.readLine());
            OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
            writer.write("收到");
            writer.flush();
            socket.shutdownOutput();  //关闭输出方向的流
            socket.shutdownInput();  //关闭输入方向的流
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            System.out.println("断开连接");
        }
    }
}
public class Client {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 8080);
             Scanner scanner = new Scanner(System.in)){
            socket.setKeepAlive(true);// 防止连接双方通知不到对方,占用资源
            OutputStream stream = socket.getOutputStream();
            OutputStreamWriter writer = new OutputStreamWriter(stream);
            String text = scanner.nextLine();
            writer.write(text+"\n");
            writer.flush();
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println(reader.readLine());
            socket.shutdownOutput();  //关闭输出方向的流
            socket.shutdownInput();  //关闭输入方向的流
        }catch (IOException e){
            System.out.println("服务器连接失败");
            e.printStackTrace();
        }finally {
            System.out.println("断开连接");
        }
    }
}

传输服务

public static void main(String[] args) {
    try(ServerSocket server = new ServerSocket(8080)){    //将服务端创建在端口8080上
        System.out.println("正在等待客户端连接...");
        Socket socket = server.accept();
        System.out.println("客户端已连接,IP地址为:"+socket.getInetAddress().getHostAddress());
        InputStream in = socket.getInputStream();  //通过
        System.out.println("接收到客户端数据:");
        while (true){
            int i = in.read();
            if(i == -1) break;
            System.out.print((char) i);
        }
    }catch (Exception e){
        e.printStackTrace();
    }
}

运行

正在等待客户端连接...
客户端已连接,IP地址为:0:0:0:0:0:0:0:1
接收到客户端数据:
GET /index HTTP/1.1
Host: localhost:8080
Connection: keep-alive
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="102", "Microsoft Edge";v="102"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.124 Safari/537.36 Edg/102.0.1245.44
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: Idea-8296eb31=35710d3e-6875-4900-8857-250e3bc54250; Webstorm-be571778=4165fe67-ef60-4387-bf40-1252a9975d60
posted @ 2022-07-08 10:18  鱼子酱caviar  阅读(40)  评论(0)    收藏  举报