Java TCP 网络编程:从可靠传输到 Socket 实战
TCP 与 UDP 的区别与相同点
- TCP 是有连接的,UDP 无连接。
- TCP 是面向字节流的,UDP 是面向数据报的。
- TCP 是可靠传输的,UDP 是不可靠传输的。
- TCP 和 UDP 都是全双工的。
连接机制
- UDP:每次发送数据报都要指定对方的地址(UDP 没有存储这个信息)。
- TCP:不需要手动指定,内核自动和客户端建立连接(TCP 三次握手)。对于应用程序来说,客户端发起'建立连接',服务器端通过
ServerSocket获取内核中已建立的连接。
ServerSocket 负责绑定端口号,并通过 accept() 方法将建立好的连接拿过来。如果瞬间有很多连接,类似于生产者消费者模型中的阻塞等待。
ServerSocket 与 Socket API 说明
- ServerSocket:给服务器使用的类,用来绑定端口号,负责把系统内核里面已经建立好的连接从队列里面拿过来。
- Socket:既会给服务器使用,也会给客户端使用,通过 socket 对象和客户端进行交互。
- 这两个类都是用来表示 socket 文件的,抽象了网卡这样的硬件设备。
TCP 服务端实战代码演示
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TcpEchoServer {
private ServerSocket serverSocket = null;
public TcpEchoServer(int serverPort) throws IOException {
// 利用系统 API 从内核中取到已经建立好的连接
serverSocket = new ServerSocket(serverPort);
}
public IOException {
System.out.println();
() {
serverSocket.accept();
Executors.newCachedThreadPool();
service.submit(() -> possessCollection(clientSocket));
}
}
{
( clientSocket.getInputStream();
clientSocket.getOutputStream()) {
(inputStream);
() {
(!scanner.hasNext()) {
System.out.printf(, clientSocket.getInetAddress(), clientSocket.getPort());
;
}
scanner.next();
process(request);
(outputStream);
printWriter.println(response);
printWriter.flush();
System.out.printf(, clientSocket.getInetAddress(), clientSocket.getPort(), request, response);
}
} (IOException e) {
e.printStackTrace();
} {
{
clientSocket.close();
} (IOException e) {
(e);
}
}
}
String {
request;
}
IOException {
();
tcpEchoServer.start();
}
}


