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

电子商务网站建设一般流程无忧代理 在线

电子商务网站建设一般流程,无忧代理 在线,搜索引擎推广入口,中国有色金属建设协会网站作为一名 Java 开发工程师,你一定在实际开发中遇到过需要建立稳定连接、可靠传输、有序通信等场景。这时,TCP(Transmission Control Protocol) 通信就成为你必须掌握的重要技能之一。TCP 是一种面向连接、可靠、基于字节流的传输协…

作为一名 Java 开发工程师,你一定在实际开发中遇到过需要建立稳定连接、可靠传输、有序通信等场景。这时,TCP(Transmission Control Protocol) 通信就成为你必须掌握的重要技能之一。

TCP 是一种面向连接、可靠、基于字节流的传输协议,广泛应用于网页请求、文件传输、数据库通信、远程调用等对数据完整性要求较高的场景。

本文将带你全面掌握:

  • TCP 的基本概念与特点
  • TCP 与 UDP 的区别
  • Java 中的 TCP 编程核心类(SocketServerSocket
  • TCP 通信的完整实现(客户端与服务端)
  • TCP 的粘包与拆包问题处理
  • 多线程处理 TCP 请求
  • 实战:构建简单的 TCP 聊天程序、远程命令执行、文件传输
  • 常见误区与最佳实践

并通过丰富的代码示例和真实项目场景讲解,帮助你写出更高效、更安全、结构更清晰的 Java TCP 通信代码。


🧱 一、什么是 TCP?

✅ TCP(Transmission Control Protocol)定义:

TCP 是一种面向连接、可靠、基于字节流的传输协议,它在发送数据前需要建立连接(三次握手),数据传输结束后释放连接(四次挥手)。

✅ TCP 的特点:

特点描述
面向连接发送数据前必须先建立连接
可靠传输数据不会丢失,保证顺序
面向字节流数据以字节流形式传输
有流量控制和拥塞控制自动调整传输速率
传输效率较低由于确认机制、重传机制,延迟较高
适用场景文件传输、网页请求、数据库通信、远程登录等

🔍 二、TCP 与 UDP 的区别

对比项TCPUDP
是否连接是(三次握手)否(无连接)
是否可靠是(有确认机制)否(无确认)
数据顺序保证顺序不保证顺序
传输效率相对较低
适用场景文件传输、网页请求、数据库通信视频会议、游戏、广播通信
Java 类SocketServerSocketDatagramSocketDatagramPacket

🧠 三、Java 中的 TCP 编程核心类

✅ 1. ServerSocket

用于监听客户端连接,是 TCP 服务端的核心类。

✅ 2. Socket

用于客户端与服务端之间的通信,代表一个连接。

✅ 3. InputStream / OutputStream

用于读取和写入数据流。


🧪 四、Java TCP 通信实战示例

示例1:TCP 服务端(单线程)

import java.io.*;
import java.net.*;public class TcpServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8888);System.out.println("服务端启动,等待连接...");Socket socket = serverSocket.accept(); // 等待客户端连接BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = reader.readLine();System.out.println("收到客户端消息:" + line);socket.close();serverSocket.close();}
}

示例2:TCP 客户端

import java.io.*;
import java.net.*;public class TcpClient {public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1", 8888);PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);writer.println("Hello Server");socket.close();}
}

🧱 五、TCP 的粘包与拆包问题

✅ 什么是粘包与拆包?

  • 粘包(Sticky Packet):多个数据包被合并成一个包接收。
  • 拆包(Split Packet):一个数据包被拆分成多个包接收。

✅ 原因:

  • TCP 是面向字节流的协议,没有消息边界
  • 操作系统或网络设备的缓冲区合并或拆分

✅ 解决方案:

  1. 自定义协议头(如消息长度、消息类型)
  2. 使用分隔符(如 \n\r\n
  3. 使用固定长度的消息体
  4. 使用 Netty 的 LineBasedFrameDecoderDelimiterBasedFrameDecoder 等解码器

🧩 六、多线程处理 TCP 请求(服务端并发处理)

import java.io.*;
import java.net.*;
import java.util.concurrent.*;public class MultiThreadTcpServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(8888);ExecutorService pool = Executors.newCachedThreadPool();System.out.println("服务端启动,等待连接...");while (true) {Socket socket = serverSocket.accept();pool.execute(new ClientHandler(socket));}}static class ClientHandler implements Runnable {private final Socket socket;public ClientHandler(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println("收到消息:" + line);}socket.close();} catch (IOException e) {e.printStackTrace();}}}
}

🧪 七、TCP 通信实战应用场景

场景1:构建 TCP 聊天程序(多线程)

// 服务端
new Thread(() -> {try (ServerSocket serverSocket = new ServerSocket(8888)) {while (true) {Socket socket = serverSocket.accept();new Thread(() -> {try (BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {String line;while ((line = reader.readLine()) != null) {System.out.println("收到消息:" + line);}} catch (IOException e) {e.printStackTrace();}}).start();}} catch (IOException e) {e.printStackTrace();}
}).start();// 客户端
Socket socket = new Socket("127.0.0.1", 8888);
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
writer.println("你好,服务器!");

场景2:远程命令执行(如 Telnet)

// 服务端接收命令并执行
Process process = Runtime.getRuntime().exec(line);
BufferedReader resultReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String resultLine;
while ((resultLine = resultReader.readLine()) != null) {writer.println(resultLine);
}

场景3:TCP 文件传输

// 客户端发送文件
FileInputStream fis = new FileInputStream("send.txt");
OutputStream os = socket.getOutputStream();
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {os.write(buffer, 0, bytesRead);
}
os.flush();// 服务端接收文件
FileOutputStream fos = new FileOutputStream("received.txt");
InputStream is = socket.getInputStream();
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {fos.write(buffer, 0, bytesRead);
}

🧱 八、TCP 通信最佳实践

实践描述
显式关闭资源使用 try-with-resources 或 finally 块关闭 socket、流
设置超时时间避免长时间阻塞,如 socket.setSoTimeout(3000)
使用缓冲流提高效率如 BufferedReaderBufferedWriter
使用多线程处理并发请求服务端应为每个连接创建新线程或使用线程池
使用协议封装通信数据自定义协议头、长度、内容,避免粘包
使用日志记录通信方便排查问题
使用异常处理机制捕获 IOExceptionUnknownHostException 等
使用 NIO 提升性能如 SocketChannel + Selector
使用 Netty 构建高性能 TCP 应用更高级的网络通信框架
使用 KeepAlive 保持连接避免连接意外断开

🚫 九、常见误区与注意事项

误区正确做法
忘记关闭 socket使用 try-with-resources 自动关闭
不设置超时导致程序挂起,应设置连接和读取超时
不处理异常必须捕获并处理网络异常
不使用缓冲流导致频繁 IO 操作,效率低
忽略协议设计导致粘包、拆包问题,应设计协议头
使用字节流直接转字符串应使用 InputStreamReader 指定编码
忽略并发处理服务端应支持多线程或 NIO
不使用日志记录通信难以排查问题,应记录请求和响应
不使用 KeepAlive应设置 socket.setKeepAlive(true)
不使用 NIO高并发下应使用非阻塞 IO 提升性能

📊 十、总结:Java TCP 通信核心知识点一览表

内容说明
TCP 定义面向连接、可靠、基于字节流的传输协议
TCP 特点保证顺序、有确认机制、适合高可靠性传输
Java 类SocketServerSocketInputStreamOutputStream
通信流程建立连接 → 读写数据 → 释放连接
粘包/拆包需要设计协议头或使用分隔符处理
实际应用聊天程序、远程调用、文件传输、数据库连接
最佳实践显式关闭资源、设置超时、协议设计、多线程
注意事项异常处理、日志记录、KeepAlive、NIO 使用

📎 十一、附录:Java TCP 通信常用技巧速查表

技巧示例
获取本机 IP 地址InetAddress.getLocalHost().getHostAddress()
获取远程 IP 地址socket.getInetAddress().getHostAddress()
设置连接超时socket.setSoTimeout(5000)
使用缓冲流new BufferedReader(new InputStreamReader(...))
使用 NIO 实现非阻塞通信SocketChannel + Selector
使用线程池处理客户端连接ExecutorService 处理每个 socket 连接
使用 Netty 构建高性能 TCP 应用NettyServerBootstrap
自定义协议头消息长度 + 消息内容
使用 KeepAlivesocket.setKeepAlive(true)
使用 PrintWriter 发送文本writer.println("message")

欢迎点赞、收藏、转发,也欢迎留言交流你在实际项目中遇到的 TCP 通信相关问题。我们下期再见 👋

📌 关注我,获取更多Java核心技术深度解析!

http://www.dtcms.com/a/461850.html

相关文章:

  • 一文了解Function Calling、MCP、Agent联系与区别
  • 存储芯片核心产业链主营产品:兆易创新、北京君正、澜起科技、江波龙、长电科技、佰维存储,6家龙头公司主营产品深度数据
  • Git 常用命令完整指南
  • 网站维护入口房子装修设计软件
  • MySQL 延时从库的作用与意义
  • h5网站价格wordpress footer.php添加qq悬浮
  • 【脚本升级】银河麒麟V10一键安装MySQL9.3.0
  • android pdf框架-15,mupdf工具与其它
  • 前端通用文件下载方案:从 Blob 流处理到实际业务落地
  • 箭头函数的this指向问题
  • 【Vue】——生命周期、ref属性、hooks
  • 网站服务器如何维护小米商城wordpress主题
  • 寻梦数据空间 | 架构篇:从概念到落地的技术实践与突破性创新
  • PySide6 文本编辑器(QPlainTextEdit)实现查找对话功能(匹配完整单词,区分大小写)——重构版本
  • golang面经——GMP相关
  • 谷歌英文网站简单的网站php开发教程
  • 免费一键自助建站官网域名及对应网站
  • AI编程Cursor最强竞争对手来了,CodeX三种操作系统喂饭级安装教程!
  • Spring Cloud Alibaba 最新五大核心组件
  • 融乐Mini1.9.3 | 支持在线播放,本地播放,内置两条线路,免费畅听全网音乐
  • 车行网站源码微信公众平台营销
  • 客户端加密 和 服务端加密:端到端安全的真正含义
  • 88-python电网可视化项目-8-1
  • 做网站要自己租服务器吗wordpress打开速度优化
  • 要看网站是多少建设一个网站需要哪些费用
  • 物联网时代下无锡漫途科技无线多参数遥测终端助力饮水安全监测
  • 公司网站建设款计什么科目wordpress jquery版本
  • 麒麟系统如何设置.sh文件的图标
  • 3D GPR切片图
  • 深圳建设网站制作公司怎样制作一个网页