socket(套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。多个TCP连接或者应用进程可能需要通过同一个TCP协议端口传输数据,为了区分不同的应用程序进程和连接,计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
1. socket通信的流程

-
服务端先初始化socket,然后和端口绑定(bind),对端口进行监听(listen)。调用accept进行阻塞,等待客户端连接。
-
客户端初始化一个socket,然后连接服务器(connect),如果连接成功,客户端可以和服务端建立连接。
-
客户端通过outputStream发送数据,服务端收到请求(inputStream去网络中读取数据)并处理请求,然后把回应的数据发送给客户端,客户端读取数据,最后关闭连接。
对应的JAVA代码
上文说到,socket可以实现数据传输的并发服务,我们可以定义多个客户端并发传输数据。
@Slf4j
public class SocketTest {
private static Socket socket;
public static void main(String[] args) throws Exception {
new Thread(() -> {
sendCommand("AAA");
}).start();
new Thread(() -> {
sendCommand("BBB");
}).start();
new Thread(() -> {
sendCommand("CCC");
}).start();
}
public static void sendCommand(String message) {
try {
socket = new Socket("127.0.0.1", 4331);
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataOutputStream.writeUTF(message);
dataOutputStream.flush();
String outMessage = dataInputStream.readUTF();
System.out.println("发送的信息:" + message + ",接受到的信息:" + outMessage);
} catch (Exception e) {
log.error("", e);
}
}
}
服务端需要先启动,并且while循环去接受客户端的消息:
public class SocketService {
private static ServerSocket server;
public static void main(String[] args) throws Exception {
server = new ServerSocket(4331);
System.out.println("等待客户端呼叫");
while (true) {
//没有消息时,此处保持阻塞
Socket socket = server.accept();
//输出信息到网络中
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
//接受信息到网络中
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
String s = dataInputStream.readUTF();
System.out.println(s);
dataOutputStream.writeUTF(s + "-CCTV");
}
}
}
2. socket通信的原理
TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

网友评论