网络之Socket编程体验2

本文详细介绍了一种使用Java实现的长连接TCP服务器与客户端交互的案例,通过解析请求和响应,服务器能够处理来自客户端的多个连续请求,利用 进行消息分割,实现了高效的消息处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
package tcp2;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
// 一个连接中有多个请求
// 长连接 + 根据 \r\n 来分割请求和响应
public class Server {
public static void main(String[] args) throws IOException {
try (ServerSocket serverSocket = new ServerSocket(8192)) {
while (true) {
try (Socket socket = serverSocket.accept()) { // 等待有客户端连接上来
// 那个客户端先连接上来,就处理哪个客户端的事情
// 服务器在专心处理 客户端1 的事情
System.out.println(" ——————————");
System.out.println(“有一个客户端连接上来了”);
InputStream is = socket.getInputStream();
InputStreamReader isReader = new InputStreamReader(is, “UTF-8”);
Scanner scanner = new Scanner(isReader);
// 没有 scanner,需要手动找 \r\n,麻烦的很
OutputStream os = socket.getOutputStream();
OutputStreamWriter osWriter = new OutputStreamWriter(os, “UTF-8”);
PrintWriter printWriter = new PrintWriter(osWriter);
// 一个连接可以发送多个请求
// 服务器在这个循环中专心处理客户端1的事情
// 不知道客户端2已经连接上来了
// 直到客户端1关闭连接了(hasNextLine() 返回 false)
// 服务器才能重新处理下一个客户端连接
while (scanner.hasNextLine()) {
String request = scanner.nextLine(); // 客户端1 没有发送数据,这个方法就不会返回
System.out.println("++++++++++++++++++");
System.out.println(request);
// 处理请求 -> 响应
String response = request;
// 发送响应,也需要带着 \r\n
printWriter.println(response);
printWriter.flush(); // 千万不要忘掉
System.out.println("++++++++++++++++++");
}
System.out.println("——————————");
}
}
}
}
}

package tcp2;
import java.io.*;
import java.net.Socket;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
Scanner stdinScanner = new Scanner(System.in);
try (Socket socket = new Socket(“127.0.0.1”, 8192)) {
OutputStream os = socket.getOutputStream();
OutputStreamWriter osWriter = new OutputStreamWriter(os, “UTF-8”);
PrintWriter printWriter = new PrintWriter(osWriter);
InputStream is = socket.getInputStream();
InputStreamReader isReader = new InputStreamReader(is, “UTF-8”);
Scanner scanner = new Scanner(isReader);
//List requestList = Arrays.asList(“今天吃了么”, “今天好冷啊”, “今天好热啊”, “回家吃去吧”);
//for (String request : requestList) {
System.out.print("请输入请求> ");
while (stdinScanner.hasNextLine()) {
String request = stdinScanner.nextLine();
printWriter.println(request);
System.out.println(“客户端请求 ->: " + request);
printWriter.flush();
String response = scanner.nextLine();
System.out.println(”<- 服务器应答: " + response);
System.out.print("请输入请求> ");
}
}
}
}
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值