Socket编程超简单理解,上层视角

117 阅读1分钟

直接上图,按照鄙人理解,涉及到 Socket 编程的,最后都离不开 POSIX 标准中提供的函数,这里使用 Linux 中的函数举例,流程图如下,需要注意 Server 端在创建完监听的 Socket 之后,执行完 accept 函数就会阻塞,此时等待 Client 端 Socket 的链接建立请求,注意,这里的流程图是 TCP 的,如需要了解 UDP,请自行搜索,无论什么语言的 Socket 编程,都需要践行下面的流程,不过流程可能被简化,或者说隐藏了某些步骤。 image.png 图片引用地址www.scaler.com/topics/sock…

这里使用 Java 中来稍稍举一个例子,这里JDK中的bind、listen等操作在创建Socket的时候就已经执行了:

Server Process:

public class Server {
    static int port = 12345; // 服务端监听的端口
    
    public static void main(String[] args) throws IOException {
        runServer();
    }

    public static void runServer() throws IOException {
        ServerSocket serverSocket = new ServerSocket(port, 30); // 监听端口,链接请求队列长度为30
        System.out.println("Server is listening on port " + port);

        try {
            while(true) {
                Socket clientSocket = serverSocket.accept(); // 阻塞等待 Client 的链接建立请求
                System.out.println("Accepted connection from " + clientSocket.getInetAddress().getHostAddress());

                // 输入流接收客户端发送的信息
                BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

                String str = in.readLine();
                System.out.println("Received message from client: " + str);

                in.close();
                clientSocket.close();
            }
        } finally {
            serverSocket.close();
        }
    }
}

Client Process:

public class Client {
    static String hostName = "localhost"; // 服务端的主机名或IP地址
    static int port = 12345; // 服务端监听的端口

    public static void main(String[] args) throws IOException {
        runClient("hello!!!");  // 发送信息到 Server 端
    }

    public static void runClient(String message) throws IOException {
        Socket socket = new Socket(hostName, port);
        System.out.println("Connected to server at " + hostName + ":" + port);
        
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        out.write(message);

        out.close();
        socket.close();
    }
}