当前位置: 首页 > news >正文

Java 简单实现一个 TCP 回显服务器

文章目录

  • TCP 服务端
  • TCP 客户端
  • 实现效果
  • TCP 服务端(实现字典功能)
  • 总结


TCP 服务端

package network;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class TcpEchoServer {ServerSocket serverSocket = null;// 此处不应该创建固定线程数目的线程池.private ExecutorService service = Executors.newCachedThreadPool();// 绑定端口号public TcpEchoServer(int port) throws IOException {serverSocket = new ServerSocket(port);}public void start() throws IOException {System.out.println("服务器启动!");while (true) {Socket clientSocket = serverSocket.accept();service.submit(new Runnable() {@Overridepublic void run() {processConnection(clientSocket);}});/*            Thread thread = new Thread(() -> {processConnection(clientSocket);});thread.start();*/}}// 通过这个方法来处理一个连接的逻辑.private void processConnection(Socket clientSocket) {System.out.printf("[%s:%d] 客户端上线!\n", clientSocket.getInetAddress().toString(), clientSocket.getPort());// 接下来就可以读取请求, 根据请求计算响应, 返回响应三步走了.// Socket 对象内部包含了两个字节流对象, 可以把这俩字节流对象获取到, 完成后续的读写工作try (InputStream inputStream = clientSocket.getInputStream();OutputStream outputStream = clientSocket.getOutputStream()) {while (true) {// 1. 获取请求并解析, 使用 Scanner 来读取Scanner scanner = new Scanner(inputStream);if (!scanner.hasNext()) {// 读取完毕, 客户端下线!System.out.printf("[%s:%d] 客户端下线!\n", clientSocket.getInetAddress().toString(), clientSocket.getPort());break;}// 这个代码暗含一个约定, 客户端发过来的请求, 得是文本数据, 同时, 还得带有空白符作为分割. (比如换行这种)String request = scanner.next();// 2. 根据请求计算响应结果String response = process(request);// 3. 把响应结果写回客户端//    把 OutputStream 使用 PrinterWriter 包裹一下, 方便进行发数据.PrintWriter writer = new PrintWriter(outputStream);//    使用 PrintWriter 的 println 方法, 把响应返回给客户端.//    此处用 println, 而不是 print 就是为了在结尾加上 \n . 方便客户端读取响应, 使用 scanner.next 读取.writer.println(response);//    这里还需要加一个 "刷新缓冲区" 操作.writer.flush();// 4. 日志显示当前请求详情.System.out.printf("[%s:%d] req: %s, resp: %s\n", clientSocket.getInetAddress().toString(), clientSocket.getPort(),request, response);}} catch (IOException e) {e.printStackTrace();} finally {try {clientSocket.close();} catch (IOException e) {e.printStackTrace();}}}public String process(String request) {return request;}public static void main(String[] args) throws IOException {TcpEchoServer server = new TcpEchoServer(9090);server.start();}
}

TCP 客户端

package network;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;public class TcpEchoClient {private Socket socket = null;// 要和服务器通信, 就需要先知道, 服务器所在的位置.public TcpEchoClient(String serverIp, int serverPort) throws IOException {socket = new Socket(serverIp, serverPort);}public void start() {System.out.println("客户端启动!");Scanner scannerConsole = new Scanner(System.in);try (InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream()) {while (true) {// 1. 在控制台上输入字符串.System.out.print("-> ");String request = scannerConsole.next();// 2. 将请求发送给服务器.PrintWriter writer = new PrintWriter(outputStream);writer.println(request);writer.flush();// 3. 从服务器读取响应.Scanner scannerNetwork = new Scanner(inputStream);String response = scannerNetwork.next();// 4. 显示响应.System.out.println(response);}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws IOException {TcpEchoClient client = new TcpEchoClient("localHost", 9090);client.start();}
}

实现效果

在这里插入图片描述
在这里插入图片描述

TCP 服务端(实现字典功能)

只需要继承自之前写的服务端, 然后重写父类 process 方法即可. 添加一些查询字典的逻辑.

package network;import java.io.IOException;
import java.util.HashMap;public class TcpDictServer extends TcpEchoServer {private HashMap<String, String> dict = new HashMap<>();public TcpDictServer(int port) throws IOException {super(port);dict.put("dog", "小狗");dict.put("cat", "小猫");dict.put("hello", "你好");}@Overridepublic String process(String request) {return dict.getOrDefault(request, "查询的单词不存在!");}public static void main(String[] args) throws IOException {TcpDictServer server = new TcpDictServer(9090);server.start();}
}

效果

在这里插入图片描述

在这里插入图片描述


总结

✨ 本文记录了一个简单的 TCP 回显服务器代码.
✨ 想了解更多计算机网络的知识, 可以收藏一下本人的计算机网络学习专栏, 里面会持续更新本人的学习记录, 跟随我一起不断学习.
✨ 感谢你们的耐心阅读, 博主本人也是一名学生, 也还有需要很多学习的东西. 写这篇文章是以本人所学内容为基础, 日后也会不断更新自己的学习记录, 我们一起努力进步, 变得优秀, 小小菜鸟, 也能有大大梦想, 关注我, 一起学习.

再次感谢你们的阅读, 你们的鼓励是我创作的最大动力!!!!!

http://www.lryc.cn/news/231632.html

相关文章:

  • 邦芒攻略:新手求职面试需要准备的材料
  • 在docker下安装suiteCRM
  • 【Python大数据笔记_day08_hive查询】
  • 魔众文库系统 v5.6.0 DWG文件格式支持,部分数据封面显示异常,定时调度清理临时文件
  • 2023 PostgreSQL 数据库生态大会:解读拓数派大数据计算系统及其云存储底座
  • Android10 手势导航
  • Pinia 插件 pinia-plugin-persist 添加 persist 属性时报错:没有与此调用匹配的重载
  • Django知识
  • vue2+antd——实现权限管理——js数据格式处理(回显+数据结构渲染)
  • ffmpeg 4.4 cenc-aes-ctr 加解密 MP4 工程性质分析
  • 网络安全/黑客技术(0基础入门到进阶提升)
  • 栈的三道oj【C++】
  • AI大模型低成本快速定制法宝:RAG和向量数据库
  • 文旅媒体有哪些?如何邀请到现场报道?
  • 搭建知识付费系统的最佳实践是什么
  • 计算机视觉:使用opencv实现车牌识别
  • 用封面预测书的价格【图像回归】
  • 阿里云服务器e实例40G ESSD Entry系统盘、2核2G3M带宽99元
  • Datawhale智能汽车AI挑战赛
  • pyclipper和ClipperLib操作多边型
  • Golang 协程、主线程
  • 【SA8295P 源码分析】125 - MAX96712 解串器 start_stream、stop_stream 寄存器配置 过程详细解析
  • pandas教程:Apply:General split-apply-combine 通常的分割-应用-合并
  • 第一讲之递归与递推下篇
  • 第十六篇-Awesome ChatGPT Prompts-备份
  • Python Web框架Django
  • 1.Spring的简单使用
  • 02.智慧商城——vant组件库使用和vw适配
  • Android笔记(十三):结合JetPack Compose和CameraX实现视频的录制和存储
  • 【开题报告】基于SpringBoot的音乐鉴赏平台的设计与实现