Socket套接字简介
Socket是网络上运行两个程序之间的双向通信链路的断点。Socket绑定到一个端口号,使得TCP层可以标识数据最终要被发送到哪个应用程序。
java.net包中提供了一个类Socket
,用于Java程序和网络其他程序之间的双向连接,Socket类隐藏了任何特定系统的细节,通过操作java.net.Socket类,Java程序可以通过独立于平台的方式与网络进行通信。
此外java.net包中包含了ServerSocket
,实现了用于服务器上的Socket,它可以监听和接收客户端的连接。
实例
下面实现一个反射对话的客户端与服务端程序。
功能为:客户端发送一句话给服务端,服务端将这句话原封不动返回给客户端。
服务端
public class EchoServer {
public static void main(String[] args) throws IOException {
// 端口号
int portNumber = 12;
// 新建一个服务端Socket
ServerSocket serverSocket = new ServerSocket(portNumber);
// 当客户端连接上后,通过服务端Socket的监听获取到客户端的Socket
Socket clientSocket = serverSocket.accept();
// 发送的数据
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
// 接收到客户端的数据
BufferedReader in = new BufferedReader(new InputStreamReader((clientSocket.getInputStream())));
String inputLine;
while ((inputLine = in.readLine()) != null){
out.println(inputLine);
}
}
}
客户端
public class EchoClient {
public static void main(String[] args) throws IOException {
String hostName = "localhost";
int portNumber = 12;
// 新建客户端的Socket
Socket echoSocket = new Socket(hostName, portNumber);
// 发送给服务端的数据
PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true);
// 接收到的数据
BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
// 原始输入数据
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("echo服务器返回的话:" + in.readLine());
}
}
}
输入输出测试
先启动服务端,再启动客户端,在客户端窗口输入任何话
123456
echo服务器返回的话:123456
你是猪
echo服务器返回的话:你是猪