JavaEE 编写Java程序,实现简单的echo程序(网络编程TCP实践练习)

Java TCP 客户端/服务器开发深度解析

一、客户端代码全注释

public class TcpClient {
    private Socket socket = null;  // TCP通信核心对象

    // 构造函数:建立TCP连接
    public TcpClient(String ip, int port) throws IOException {
        // 创建Socket时会自动进行三次握手
        socket = new Socket(ip, port);  // 参数1: 服务器IP  参数2: 端口号
    }

    public void start() throws IOException {
        System.out.println("客户端启动");
        // try-with-resources 自动关闭资源
        try (InputStream in = socket.getInputStream();   // 接收数据的字节流
             OutputStream out = socket.getOutputStream(); // 发送数据的字节流
             Scanner scannerConsole = new Scanner(System.in); // 控制台输入
             Scanner scannerIn = new Scanner(in)) {      // 网络输入解析
            
            while (true) {
                // 1. 控制台输入处理
                System.out.print("-> ");
                String request = scannerConsole.next();  // 阻塞等待用户输入

                // 2. 发送请求到服务器
                PrintWriter printWriter = new PrintWriter(out); // 包装输出流
                printWriter.println(request);  // 自动添加换行符
                printWriter.flush();           // 强制立即发送缓冲区内容

                // 3. 接收服务器响应
                if (!scannerIn.hasNext()) break; // 检测连接是否关闭
                String response = scannerIn.next();
                System.out.println("服务器响应: " + response);
            }
        } // 自动关闭所有资源:socket、流、Scanner
    }
}

客户端核心三要素:

  1. 连接建立:通过new Socket()完成TCP三次握手
  2. 数据通道
    • getInputStream()获取接收数据流
    • getOutputStream()获取发送数据流
  3. 资源管理:使用try-with-resources自动释放连接

二、服务器代码全注释

public class TcpServer {
    private ServerSocket serverSocket = null;  // 服务端监听套接字

    // 初始化服务器
    public TcpServer(int port) throws IOException {
        serverSocket = new ServerSocket(port); // 绑定指定端口
        System.out.println("服务器监听端口: " + port);
    }

    public void start() throws IOException {
        System.out.println("启动服务器主线程");
        while (true) {
            // 阻塞等待客户端连接(核心方法)
            Socket clientSocket = serverSocket.accept(); 
            System.out.println("检测到新连接");

            // 为每个客户端创建独立线程
            new Thread(() -> {
                try {
                    processConnection(clientSocket); // 处理客户端业务
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }

    // 处理单个客户端连接
    private void processConnection(Socket clientSocket) throws IOException {
        // 获取客户端地址信息
        String clientInfo = String.format("[%s:%d]", 
            clientSocket.getInetAddress(), 
            clientSocket.getPort());
        
        try (InputStream inputStream = clientSocket.getInputStream();
             OutputStream outputStream = clientSocket.getOutputStream()) {
            
            Scanner scanner = new Scanner(inputStream);
            System.out.println(clientInfo + " 客户端上线");

            while (scanner.hasNext()) {  // 持续监听客户端请求
                // 1. 读取请求
                String request = scanner.next();
                
                // 2. 处理业务逻辑
                String response = process(request); 
                
                // 3. 返回响应
                PrintWriter printWriter = new PrintWriter(outputStream);
                printWriter.println(response);
                printWriter.flush();  // 确保数据立即发送
                
                System.out.println(clientInfo + " 处理请求: " + request);
            }
        }
        System.out.println(clientInfo + " 客户端下线");
    }

    // 业务处理(示例直接返回原字符串)
    private String process(String request) {
        return request.toUpperCase(); // 示例:转为大写
    }
}

服务器核心三要素:

  1. 端口监听ServerSocket绑定指定端口
  2. 连接接收accept()方法阻塞等待连接
  3. 并发处理:为每个客户端创建独立线程

三、关键方法深度解析

3.1 accept()方法详解

Socket clientSocket = serverSocket.accept();
  • 阻塞特性:在没有客户端连接时,线程会在此处挂起
  • 返回对象:返回的Socket对象包含:
    • 客户端IP地址(getInetAddress()
    • 客户端端口(getPort()
    • 新的数据通道(输入/输出流)
  • 并发基础:每次accept返回新的Socket,实现多客户端处理

3.2 flush()的必要性

printWriter.flush();
场景无flush有flush
数据传输时机缓冲区满时自动发送立即强制发送
适用场景大数据量传输需要实时交互的场景
风险点数据可能长时间滞留增加网络包数量

缓冲区原理

客户端内存:[数据1][数据2][数据3] → 缓冲区填满后自动发送
手动flush: [数据1] → 立即发送 → [数据2] → 立即发送

四、TCP核心组件对比

4.1 ServerSocket vs Socket

特性ServerSocketSocket
用途服务端监听端口建立实际数据通道
创建时机服务启动时创建accept()成功后自动创建
生命周期整个服务运行期间存在单个连接周期内存在
主要方法accept(), bind(), close()getInputStream(), close()

4.2 TCP通信全流程

客户端 服务器 SYN SYN-ACK ACK 三次握手完成 发送数据(request) 返回响应(response) FIN ACK FIN ACK 四次挥手断开 客户端 服务器

五、IntelliJ多实例运行配置

5.1 配置步骤演示

  1. 打开运行配置
    Run -> Edit Configurations
    
  2. 启用多实例
    选择客户端配置 -> Modify options -> Allow multiple instances
    
  3. 运行效果
    可以同时启动多个客户端进程
    每个进程独立连接到服务器
    

5.2 实现原理

  • JVM进程隔离:每个客户端运行在独立JVM中
  • 端口重用:客户端使用临时端口(1024-65535)
  • 服务端设计
    new Thread(() -> processConnection(clientSocket)).start();
    
    每个连接使用独立线程处理

六、最佳实践建议

  1. 资源关闭顺序

    // 正确关闭顺序示例
    try (Socket socket = new Socket(...);
         OutputStream out = socket.getOutputStream();
         InputStream in = socket.getInputStream()) {
        // 使用资源
    } // 自动反向关闭:in -> out -> socket
    
  2. 异常处理规范

    catch (IOException e) {
        System.err.println("连接异常: " + e.getMessage());
        // 需要手动关闭资源
        try {
            if (socket != null) socket.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    
  3. 性能优化技巧

    • 使用线程池代替裸线程
    • 设置合理的Socket超时时间
    • 采用NIO非阻塞模式处理高并发

通过深入理解TCP通信机制和Java网络API的实现原理,开发者可以构建出稳定高效的网络应用程序。多线程服务器的设计需要特别注意资源竞争和线程安全问题,在实际生产环境中建议使用ExecutorService等高级并发工具进行线程管理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快速排序(详解)c++

快速排序(Quick Sort),既然敢起这样的名字,说明它是常⻅排序算法中较为优秀的。事实上,在很多情况下,快排确实是效率较⾼的算法;c的排序是以快排为基础,再加上堆排和插入排序做优化实现的,我们这…

【工具变量】公司企业数字领导力(2004-2023年)

数据简介:企业数字化领导力是指在数字经济时代,领导者通过战略性地使用数字资产、引领组织变革,使企业在数字化环境中获得持续成功的能力。对于上市公司而言,这种领导力尤为重要,因为它直接关系到企业的战略方向、市场…

浅谈新能源汽车充电桩建设问题分析及解决方案

摘要: 在全球倡导低碳减排的大背景下,新能源成为热门行业在全球范围内得以开展。汽车尾气排放会在一定程度上加重温室效应,并且化石能源的日渐紧缺也迫切对新能源汽车发展提出新要求。现阶段的新能源汽车以电力汽车为主,与燃油汽…

seacmsv9报错注入

1、seacms的介绍 ​ seacms中文名&#xff1a;海洋影视管理系统。是一个采用了php5mysql架构的影视网站框架&#xff0c;因此&#xff0c;如果该框架有漏洞&#xff0c;那使用了该框架的各个网站都会有相同问题。 2、源码的分析 漏洞的部分源码如下&#xff1a; <?php …

python学习四

python运算符与表达式 表达式: Python中的表达式是一种计算结果的代码片段。它可以包 含变量、运算符、常数和函数调用,用于执行各种数学、逻辑 和功能操作 算术运算符: 比较(关系)运算符: 赋值运算符: 逻辑运算符: 位运算符: 成员运算符: 身份运算符 <

Nginx面试宝典【刷题系列】

文章目录 1、nginx是如何实现高并发的&#xff1f;2、Nginx如何处理HTTP请求&#xff1f;3、使用“反向代理服务器”的优点是什么?4、列举Nginx服务器的最佳用途。5、Nginx服务器上的Master和Worker进程分别是什么?6、什么是C10K问题?7、请陈述stub_status和sub_filter指令的…

数字可调控开关电源设计(论文+源码)

1 设计要求 在本次数字可调控开关电源设计过程中&#xff0c;对关键参数设定如下&#xff1a; &#xff08;1&#xff09;输入电压&#xff1a;DC24-26V,输出电压&#xff1a;12-24&#xff08;可调&#xff09;&#xff1b; &#xff08;2&#xff09;输出电压误差&#xf…

清华大学《AIGC发展研究3.0》

大家好&#xff0c;我是吾鳴。 AIGC已经爆火好长一段时间了&#xff0c;特别是DeepSeek的爆火&#xff0c;直接让很多之前没有体会过推理模型的人可以免费的使用上推理模型&#xff0c;同时DeepSeek产品形态也是全球首创&#xff0c;就是直接把AI的思考过程展示给你看&#xff…

模型和数据集的平台之在Hugging Face上进行模型下载、上传以及创建专属Space

模型下载 步骤&#xff1a; 注册Hugging Face平台 https://huggingface.co/ 新建一个hf_download_josn.py 文件 touch hf_download_josn.py 编写hf_download_josn.py文件 import os from huggingface_hub import hf_hub_download# 指定模型标识符 repo_id "inter…

脚本无法获取响应主体(原因:CORS Missing Allow Credentials)

背景&#xff1a; 前端的端口号8080&#xff0c;后端8000。需在前端向后端传一个参数&#xff0c;让后端访问数据库去检测此参数是否出现过。涉及跨域请求&#xff0c;一直有这个bug是404文件找不到。 在修改过程当中不小心删除了一段代码&#xff0c;出现了这个bug&#xff…

C#实现本地AI聊天功能(Deepseek R1及其他模型)。

前言 1、C#实现本地AI聊天功能 WPFOllamaSharpe实现本地聊天功能,可以选择使用Deepseek 及其他模型。 2、此程序默认你已经安装好了Ollama。 在运行前需要线安装好Ollama,如何安装请自行搜索 Ollama下载地址&#xff1a; https://ollama.org.cn Ollama模型下载地址&#xf…

Buildroot 添加自定义模块-内置文件到文件系统

目录 概述实现步骤1. 创建包目录和文件结构2. 配置 Config.in3. 定义 cp_bin_files.mk4. 添加源文件install.shmy.conf 5. 配置与编译 概述 Buildroot 是一个高度可定制和模块化的嵌入式 Linux 构建系统&#xff0c;适用于从简单到复杂的各种嵌入式项目. buildroot的源码中bui…

音视频入门基础:RTP专题(12)——RTP中的NAL Unit Type简介

一、引言 RTP封装H.264时&#xff0c;RTP对NALU Header的nal_unit_type附加了扩展含义。 由《音视频入门基础&#xff1a;H.264专题&#xff08;4&#xff09;——NALU Header&#xff1a;forbidden_zero_bit、nal_ref_idc、nal_unit_type简介》可以知道&#xff0c;nal_unit…

智慧园区后勤单位消防安全管理:安全运营和安全巡检

//智慧园区消防管理困境大曝光 智慧园区&#xff0c;听起来高大上&#xff0c;但消防管理却让人头疼不已。各消防子系统各自为政&#xff0c;像一座座孤岛&#xff0c;信息不共享、不协同。 消防设施管理分散&#xff0c;不同区域、企业的设备标准不一样&#xff0c;维护情况…

RAG(检索增强生成)原理、实现与评测方法探讨

RAG是什么&#xff1f; 看一下RAG的英文全称&#xff1a;Retrieval-Augmented Generation&#xff0c;建索、增强、生成&#xff1b;一句话串起来就是通过检索增强模型的生成&#xff0c;是的&#xff0c;这就是RAG。 RAG怎么做&#xff1f; 目前比较通用的套路是这样的&#x…

表单制作代码,登录动画背景前端模板

炫酷动效登录页 引言 在网页设计中,按钮是用户交互的重要元素之一。一个炫酷的按钮特效不仅能提升用户体验,还能为网页增添独特的视觉吸引力。今天,我们将通过CSS来实现一个“表单制作代码,登录动画背景前端模板”。该素材呈现了数据符号排版显示出人形的动画效果,新颖有…

HBuilder X安装教程(2025版)

一&#xff0c;官网下载最新包&#xff1a; 官网链接&#xff1a;HBuilderX-高效极客技巧 等待工具包&#xff0c;下载好。 二&#xff0c;安装打开工具&#xff1a; 把HBuilderX压缩包进行压缩&#xff0c;然后打开压缩后的文件夹

【算法系列】希尔排序算法

文章目录 希尔排序算法&#xff1a;一种高效的排序方法一、基本思想二、实现步骤1. 初始化增量2. 分组与排序3. 缩小增量4. 最终排序 三、代码实现四、增量序列的选择1. Shell增量序列2. Hibbard增量序列3. Sedgewick增量序列 五、时间复杂度六、总结 希尔排序算法&#xff1a;…

VMware虚拟机Mac版安装Win10系统

介绍 Windows 10是由美国微软公司开发的应用于计算机和平板电脑的操作系统&#xff0c;于2015年7月29日发布正式版。系统有生物识别技术、Cortana搜索功能、平板模式、桌面应用、多桌面、开始菜单进化、任务切换器、任务栏的微调、贴靠辅助、通知中心、命令提示符窗口升级、文…

android keystore源码分析

架构 Android Keystore API 和底层 Keymaster HAL 提供了一套基本的但足以满足需求的加密基元&#xff0c;以便使用访问受控且由硬件支持的密钥实现相关协议。 Keymaster HAL 是由原始设备制造商 (OEM) 提供的动态加载库&#xff0c;密钥库服务使用它来提供由硬件支持的加密服…