前言
使用 socket 的通信模式
java.net 程序包将基于TCP 通信的socket 封装为两个类:类Socket 表达了一个用于建立TCP 连接的socket,该socket 既可由客户程序使用,也可由服务程序
使用;类ServerSocket 则是一个服务端专门监听客户程序连接请求的socket 的抽象,仅在服务程序中使用。
Socket通信过程
服务器端:
① 创建ServerSocket对象,绑定监听端口
② 通过accept()方法监听客户端请求
③ 连接建立后,通过输入流读取客户端发送的请求信息
④ 通过输出流向客户端发送响应信息
⑤ 关闭连接
客户端:
① 创建Socket对象,指明需要连接的服务器的地址和端口号
② 连接建立后,通过输出流想服务器端发送请求信息
③ 通过输入流获取服务器响应的信息
④ 关闭连接
单线程服务程序代码
服务端:
import java.net.*;
import java.io.*;
public class EchoServer {
public static void main(String[] args)throws IOException {
if (args.length != 1) {
System.out.println("用法:EchoServer <端口号>");
return ;
}
// 监听客户程序的连接请求
ServerSocket listenSocket = new ServerSocket(Integer.parseInt(args[0]));
System.out.println("服务程序正在监听端口" + args[0]);
Socket socket = listenSocket.accept();
// 从与客户程序的新建连接获取输入流和输出流
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader
(socket.getInputStream()));
// 从客户端读取数据,并写回数据的加工结果
String message;
while ((message = in.readLine()) != null) {
System.out.println("收到请求:" + message);
out.println(message.toUpperCase());
}
// 关闭连接
out.close();
in.close();
socket.close();
listenSocket.close();
}
}
客户端:
import java.net.*;
import java.io.*;
public class EchoClient {
public static void main(String[] args)throws Exception {
if (args.length != 2) {
System.out.println("用法:EchoClient <主机名> <端口号>");
return ;
}
// 建立连接并打开相关联的输入流和输出流
Socket socket = new Socket(args[0], Integer.parseInt(args[1]));
System.out.println("当前socket信息:" + socket);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader
(socket.getInputStream()));
// 将控制台输入的字符串发送给服务端,并显示从服务端获取的处理结果
BufferedReader stdIn = new BufferedReader(new InputStreamReader
(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("返回:" + in.readLine());
}
stdIn.close();
// 关闭连接
out.close();
in.close();
socket.close();
}
}
运行结果示例(基于windows)