Java TCP 通信:实现简单的 Echo 服务器与客户端

TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议。与 UDP 不同,TCP 保证了数据的顺序、可靠性和完整性,适用于需要可靠传输的应用场景,如文件传输、网页浏览等。本文将基于 Java 实现一个简单的 TCP Echo 服务器和客户端,并通过代码总结相关的知识点。


1. TCP Echo 服务器

1.1 服务器代码结构

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class TcpEchoServer {private ServerSocket serverSocket = null;public TcpEchoServer(int port) throws IOException {serverSocket = new ServerSocket(port);}public void start() throws IOException {System.out.println("服务器启动!");ExecutorService executorService = Executors.newCachedThreadPool();while (true) {// 通过 accept 方法,把内核中已经建立好的连接拿到应用程序中Socket clientSocket = serverSocket.accept();// 使用线程池处理客户端连接executorService.submit(() -> {try {processConnection(clientSocket);} catch (IOException e) {e.printStackTrace();}});}}// 通过这个方法,来处理连接public void processConnection(Socket clientSocket) throws IOException {// 打印客户端上线日志System.out.printf("[%s:%d] 客户端上线!\n", clientSocket.getInetAddress(), clientSocket.getPort());try (InputStream inputStream = clientSocket.getInputStream();OutputStream outputStream = clientSocket.getOutputStream()) {// 使用 Scanner 读取客户端请求Scanner scanner = new Scanner(inputStream);while (true) {if (!scanner.hasNext()) {// 连接断开System.out.printf("[%s:%d] 客户端下线!\n", clientSocket.getInetAddress(), clientSocket.getPort());break;}// 1. 读取请求并解析String request = scanner.next();// 2. 根据请求计算响应String response = process(request);// 3. 把响应写回到客户端PrintWriter printWriter = new PrintWriter(outputStream);printWriter.println(response);printWriter.flush();// 4. 打印请求交互的内容System.out.printf("[%s:%d] req=%s, resp=%s\n", clientSocket.getInetAddress(), clientSocket.getPort(),request, response);}} catch (IOException e) {e.printStackTrace();} finally {clientSocket.close();}}public String process(String request) {return request;}public static void main(String[] args) throws IOException {TcpEchoServer server = new TcpEchoServer(9090);server.start();}
}
1.2 服务器代码解析
ServerSocket:ServerSocket 是 Java 中用于监听客户端连接的类。服务器通过 ServerSocket 绑定到指定端口,等待客户端连接。Socket:Socket 是 Java 中用于表示客户端连接的类。服务器通过 serverSocket.accept() 方法获取客户端的连接,并返回一个 Socket 对象。线程池:为了支持多客户端并发连接,服务器使用 ExecutorService 线程池来处理每个客户端的请求。Executors.newCachedThreadPool() 创建了一个可缓存的线程池,根据需要创建新线程。processConnection():该方法用于处理客户端连接。它通过 InputStream 和 OutputStream 与客户端进行数据交互。Scanner:Scanner 用于从 InputStream 中读取客户端发送的请求数据。PrintWriter:PrintWriter 用于将响应数据写入 OutputStream,并发送给客户端。日志打印:服务器在处理每个请求后,会打印客户端的地址、端口、请求内容和响应内容,方便调试和监控。2. TCP Echo 客户端
2.1 客户端代码结构
java复制import java.io.*;
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() {Scanner scanner = new Scanner(System.in);try (InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream()) {PrintWriter writer = new PrintWriter(outputStream);Scanner scannerNetwork = new Scanner(inputStream);while (true) {// 从控制台读取用户输入System.out.print("-> ");String request = scanner.next();// 发送请求到服务器writer.println(request);writer.flush();// 读取服务器响应String response = scannerNetwork.next();System.out.println(response);}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws IOException {TcpEchoClient client = new TcpEchoClient("127.0.0.1", 9090);client.start();}
}

2. TCP Echo 客户端

2.1 客户端代码结构

import java.io.*;
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() {Scanner scanner = new Scanner(System.in);try (InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream()) {PrintWriter writer = new PrintWriter(outputStream);Scanner scannerNetwork = new Scanner(inputStream);while (true) {// 从控制台读取用户输入System.out.print("-> ");String request = scanner.next();// 发送请求到服务器writer.println(request);writer.flush();// 读取服务器响应String response = scannerNetwork.next();System.out.println(response);}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws IOException {TcpEchoClient client = new TcpEchoClient("127.0.0.1", 9090);client.start();}
}

2.2 客户端代码解析

  1. Socket:客户端通过 Socket 连接到服务器。Socket 的构造函数需要指定服务器的 IP 地址和端口号。

  2. InputStream 和 OutputStream:客户端通过 InputStream 读取服务器返回的响应数据,通过 OutputStream 发送请求数据。

  3. PrintWriterPrintWriter 用于将请求数据写入 OutputStream,并发送给服务器。

  4. ScannerScanner 用于从控制台读取用户输入,并从 InputStream 中读取服务器返回的响应数据。

  5. 循环交互:客户端通过一个无限循环,不断从控制台读取用户输入,发送请求并接收响应。


3. 总结

通过实现这个简单的 TCP Echo 服务器和客户端,我们可以总结出以下知识点:

  1. TCP 协议的特点:TCP 是一种面向连接的协议,保证了数据的顺序、可靠性和完整性,适用于需要可靠传输的应用场景。

  2. ServerSocket 和 Socket:这两个类是 Java 中实现 TCP 通信的核心类。ServerSocket 用于监听客户端连接,Socket 用于表示客户端连接。

  3. 多线程处理:为了支持多客户端并发连接,服务器使用线程池来处理每个客户端的请求。

  4. 流操作InputStream 和 OutputStream 是 Java 中用于读写数据的核心类。通过 Scanner 和 PrintWriter,可以方便地进行文本数据的读写。

  5. 日志与调试:在实际开发中,打印日志是非常重要的,它可以帮助我们监控程序的运行状态,排查问题。

  6. Echo 服务器的应用:Echo 服务器是一种简单的网络服务,它将客户端发送的数据原样返回。虽然简单,但它可以帮助我们理解网络通信的基本原理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/71451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ollama+Deepseek-R1+Continue本地集成VScode

一、OllamaDeepseek-R1Continue本地集成VScode 1)安装前知识点 Continue 介绍 详情可参照官网: continue官网 Continue 是 Visual Studio Code 和 JetBrains 中领先的开源 AI 代码助手。 •在侧边栏中进行聊天以理解和迭代代码。 •自动补全&#…

风虎云龙R87与RH87八卡服务器震撼首发

在科技迅猛发展的今天,人工智能(AI)领域正以前所未有的速度改变着世界。从内容创作的智能化,到智能客服的广泛应用,AI技术已经深入到我们生活的方方面面。而这一切的背后,都离不开高性能算力设备的强大支撑…

18.分布式任务调度

固定的时间点去执行固定的任务,这就是任务调度。

Element UI-Select选择器结合树形控件终极版

Element UI Select选择器控件结合树形控件实现单选和多选&#xff0c;并且通过v-model的方式实现节点的双向绑定&#xff0c;封装成vue组件&#xff0c;文件名为electricity-meter-tree.vue&#xff0c;其代码如下&#xff1a; <template><div><el-select:valu…

多线程-定时任务线程池源码

定时任务线程池 ScheduledThreadPoolExecutor&#xff0c;可以执行定时任务的线程池。这里学习它的基本原理。 定时任务线程池&#xff0c;和普通线程池不同的地方在于&#xff0c;它使用一个延迟队列&#xff0c;延迟队列使用最小堆作为它的数据结构&#xff0c;它会按照任务…

系统盘还原成正常U盘

选择格式化,等格式化完毕就完了 点击还原设备的默认值格式化就完了

Linux系统下安装配置 Nginx 超详细图文教程_linux安装nginx

#安装当前路径下所有安装包 rpm -Uvh *.rpm --nodeps --force2.2、安装Nginx 找到Nginx的安装包进行解压 #解压安装包 tar -zxvf nginx-1.24.0.tar.gz进入解压之后的nginx目录下&#xff1a; #进入nginx目录 cd /usr/local/nginx-1.24.0执行配置脚本&#xff0c;–prefix是指…

【玩转正则表达式】替换与正则表达式的结合

在文本处理和数据分析的领域中&#xff0c;正则表达式&#xff08;Regular Expressions&#xff0c;简称regex&#xff09;是一种强大而灵活的工具。它能够帮助用户匹配、搜索、替换和编辑字符串中的特定模式。而光能匹配可能在实际使用场景中还不是很足够&#xff0c;有时候我…

如何排查服务器内存泄漏问题

服务器内存泄漏是一种常见的问题&#xff0c;可能导致系统性能下降甚至系统崩溃。以下是一般情况下用于排查服务器内存泄漏问题的步骤&#xff1a; 排查服务器内存泄漏问题的步骤&#xff1a; 监控系统资源&#xff1a; 使用系统监控工具&#xff08;如top、htop、free&#x…

Linux使用笔记:Find Tree 命令

Tree 命令的使用 使用-I 参数&#xff0c;过滤掉不想展未的目录或文件使用-L参数&#xff0c;指定展示的目录层级个数 arsenaltxzq1899:~/Workspace/vue-application$ tree -I node_modules/ -I public/ -L 2 . ├── components.json ├── Dockerfile ├── ecosystem.c…

山东大学计算机科学与技术学院软件工程实验日志

--- Author: "Inori_333" Date: 2025-03-04 --- 实验一 团队建立、阅读开源软件 1.队伍创建与分工 队伍最终确定由5人组成&#xff0c;小组成员之间进行了高效的沟通&#xff0c;并确定了各自的负责的部分内容。 2.代码复现与分析 写在前面&#xff1a;由于“…

深入 Vue.js 组件开发:从基础到实践

深入 Vue.js 组件开发&#xff1a;从基础到实践 Vue.js 作为一款卓越的前端框架&#xff0c;其组件化开发模式为构建高效、可维护的用户界面提供了强大支持。在这篇博客中&#xff0c;我们将深入探讨 Vue.js 组件开发的各个方面&#xff0c;从基础概念到高级技巧&#xff0c;助…

历年杭州电子科技大学计算机考研复试上机真题

历年杭州电子科技大学计算机考研复试机试真题 在线评测&#xff1a;https://app2098.acapp.acwing.com.cn/ 最大公约数和最小公倍数 题目描述 输入两个正整数 m 和 n&#xff0c;求其最大公约数和最小公倍数。 输入格式 两个整数 输出格式 最大公约数&#xff0c;最小公…

单片机入门(一)

一、单片机的内部资源 Flash&#xff1a;程序存储空间 RAM&#xff1a; 数据存储空间 SFR: 特殊功能寄存器的简称。它存在于单片机的内部存储空间中&#xff0c;用于存储控制单片机各种硬件模块工作的数据。这些寄存器具有特定的功能&#xff0c;控制着单片机的各种操作&#…

将 MySQL 数据高效导入 Redis

目录 1. RESP 协议 &#xff08;1&#xff09;RESP 协议的优点 &#xff08;2&#xff09;RESP 支持的 5 种数据类型 &#xff08;3&#xff09;RESP 的用途 &#xff08;4&#xff09;RESP 协议示例 2. redis-cli 的 pipe 模式 &#xff08;1&#xff09;pipe 模式的作…

mybatis映射文件相关的知识点总结

mybatis映射文件相关的知识点总结 mybatis官网地址 英文版&#xff1a;https://mybatis.org/mybatis-3/index.html 中文版&#xff1a;https://mybatis.p2hp.com/ 搭建环境 /* SQLyog Ultimate v10.00 Beta1 MySQL - 8.0.30 : Database - mybatis-label *****************…

SQLAlchemy系列教程:SQLAlchemy快速入门示例项目

SQLAlchemy是与数据库交互的Python开发人员不可或缺的库。这个强大的ORM允许使用python结构进行简单的数据库操作。设置过程很简单&#xff0c;并且允许可扩展的数据库应用程序开发。本文通过入门项目完整介绍SQLAlchemy的应用过程&#xff0c;包括安装依赖包&#xff0c;创建连…

HTML + CSS 题目

1.说说你对盒子模型的理解? 一、是什么 对一个文档进行布局的时候&#xff0c;浏览器渲染引擎会根据标准之一的css基础盒模型&#xff0c;将所有元素表示为一个个矩形的盒子。 一个盒子由四个部分组成: content&#xff0c;padding&#xff0c;border&#xff0c;margin 下…

el-table 手动选择展示列

需求&#xff1a; 由于表格的列过多,用滚动条进行滚动对比数据不方便&#xff0c;所以提出&#xff0c;手动选择展示列 实现思路&#xff1a; 表格默认展示所有字段&#xff0c;每个字段通过 v-if 属性来进行判断是否显示&#xff1b;点击设置按钮图标(表格右上角&#xff0…

家政预约小程序用例图分析

在和客户进行需求沟通的时候&#xff0c;除了使用常规的问答的形式&#xff0c;我还使用图形化工具更深入的沟通。比如借助UML的用例图来开展系统分析&#xff0c;并且按照角色详细拆解了家政预约小程序的各个用例。在分析阶段思考的越多&#xff0c;沟通的越多&#xff0c;在系…