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