服务端
- 第一步:创建 ServerSocket 对象绑定监听端口。
- 第二步:通过 accept() 方法监听客户端的请求。
- 第三步:建立连接后,通过输入输出流读取客户端发送的请求信息。
- 第四步:通过输出流向客户端发送请求信息。
- 第五步:关闭资源。
线程类
public class ServerThread implements Runnable {
Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
// 连接建立后,通过输入流读取客户端发送的请求信息
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String temp = null;
String info = "";
while ((temp = bufferedReader.readLine()) != null) {
info += temp;
}
System.out.println("客户端说:" + info);
System.out.println("客户端IP:" + socket.getInetAddress().getHostAddress());
// 通过输出流向客户端发送响应信息
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream);
printWriter.print("响应成功");
printWriter.flush();
socket.shutdownOutput();
// 关闭资源
printWriter.close();
outputStream.close();
bufferedReader.close();
inputStream.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
服务类
public class Server {
public static void main(String[] args) {
try {
// 创建ServerSocket对象,绑定监听端口
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务端已启动,等待客户端连接...");
Socket socket = null;
int count = 0;
while (true) {
// 通过accept()方法监听客户端请求,返回一个Socket对象
socket = serverSocket.accept();
// 创建新线程
Thread thread = new Thread(new ServerThread(socket));
thread.start();
count++;
System.out.println("服务器被连接过的次数:" + count);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端
- 第一步:创建 Socket 对象,指明需要连接的服务器的地址和端口。
- 第二步:建立连接后,通过输出流向服务器发送请求信息。
- 第三步:通过输入流获取服务器的响应信息。
- 第四步:关闭资源。
public class Client {
public static void main(String[] args) {
try {
// 创建Socket对象,指明需要连接的服务器的地址和端口号
Socket socket = new Socket("localhost", 8888);
// 连接建立后,通过输出流向服务器发送请求信息
OutputStream outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream);
printWriter.print("我是小明");
printWriter.flush();
socket.shutdownOutput();
// 通过输入流获取服务器响应的信息
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String info = "";
String temp = null;
while ((temp = bufferedReader.readLine()) != null) {
info += temp;
}
System.out.println("服务器说:" + info);
// 关闭资源
bufferedReader.close();
inputStream.close();
printWriter.close();
outputStream.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行
- 第一步:服务器端创建 ServerSocket,循环调用 accept() 等待客户端连接。
- 第二步:客户端创建一个 socket 并请求和服务器端连接。
- 第三步:服务器端接受客户端请求,创建 socket 与该客户建立专线连接。
- 第四步:建立连接的两个 socket 在一个单独的线程上对话。
- 第五步:服务器端继续等待新的连接。
服务端结果
客户端结果