✨【Socket 网络编程进阶】(二) TCP vs UDP:Socket 的两种核心“性格”深度剖析 | Java 实战初探

文章标题:✨【Socket 网络编程进阶】(二) TCP vs UDP:Socket 的两种核心“性格”深度剖析 | Java 实战初探

标签: #Java #Socket #TCP #UDP #网络协议 #网络编程 #优快云


哈喽,各位在 优快云 持续探索的小伙伴们!👋 上一篇我们一起揭开了 Socket 的神秘面纱,知道了它是网络通信的“电话线”和“连接器”(还没看?赶紧戳这里回顾一下哦!)。但 Socket 这位“通信使者”可不止一种面孔,它至少有两位性格迥异的“双胞胎兄弟”——TCP Socket (流式套接字)UDP Socket (数据报套接字)!✨

“它俩有啥不一样?我什么时候该用哪个?” 🤔 这正是我们今天要深入探讨的核心问题!理解了 TCP 和 UDP 的“性格”差异,才能在实际开发中为你的网络应用选择最合适的“通信伙伴”。

今天这篇,我们就来深度剖析这两位“性格”各异的 Socket 类型,看看它们是如何工作的,各自的优缺点是什么,以及在 Java 中如何初步与它们“打交道”。无论你是想打牢网络基础的萌新 🌱,还是希望在项目选型时更有底气的开发者,这篇都值得你细细品味!收藏⭐+关注👀,我们继续 Socket 的奇妙之旅!

🤝 性格稳重的大哥:TCP Socket (流式套接字)

首先登场的是我们网络世界里的“稳重派代表”——TCP Socket。TCP 全称 Transmission Control Protocol (传输控制协议),基于它创建的 Socket 我们通常称为流式套接字 (Stream Sockets)

TCP Socket 的核心“性格”特点:

  1. 面向连接 (Connection-Oriented):

    • 这是 TCP 最显著的特征。在正式开始数据传输之前,通信双方(客户端和服务器)必须先通过著名的**“三次握手 (Three-way Handshake)”建立一个可靠的连接。只有连接成功建立后,数据才能开始流动。通信结束后,还需要通过“四次挥手 (Four-way Handshake)”**来断开连接。
    • 大白话时间: 就像我们上一篇提到的打电话📞。你得先拨号,对方接听,双方确认“喂喂喂,听得到吗?”之后,才能开始正式聊天。聊完了,还得客气地说声“拜拜”,双方都挂断电话,通话才算结束。
  2. 可靠传输 (Reliable):

    • TCP 提供了一系列机制来确保数据能够准确、无误地从发送端到达接收端。这些机制包括:
      • 数据包确认 (Acknowledgement, ACK): 接收方收到数据后会向发送方发送确认信息。
      • 超时重传 (Timeout Retransmission): 如果发送方在一定时间内没有收到确认,会重新发送丢失的数据包。
      • 数据排序 (Sequencing): TCP 会给发送的每个字节进行编号,确保接收方能按正确的顺序重组数据,即使数据包在网络中乱序到达。
      • 流量控制 (Flow Control): 通过滑动窗口机制,防止发送方发送过多数据,导致接收方处理不过来。
      • 拥塞控制 (Congestion Control): 当网络发生拥塞时,TCP 会主动降低发送速率,避免加剧网络拥堵。
    • 小红书式比喻: 就像你寄送一份非常重要的合同文件,你选择了最靠谱的快递公司(比如顺丰),他们会给你回执(确认收到),如果中途丢了会帮你找或者重新寄(超时重传),保证文件完整无损地按时送到对方手中。
  3. 面向字节流 (Byte-Stream Oriented):

    • TCP 将应用程序交付的数据视为一个没有明确边界的、连续的字节序列。接收方从这个字节流中读取数据,而 TCP 本身并不关心这些字节具体代表什么应用层消息。应用程序需要自己处理消息的“边界”问题(比如定义消息长度或使用特殊分隔符)。
    • 举个栗子: 你通过 TCP 发送了 “Hello” 和 “World” 两个字符串,接收方可能会一次性收到 “HelloWorld”,也可能先收到 “HelloW”,再收到 “orld”。TCP 只保证字节的顺序和完整性,不保证按你发送的次数和块大小来接收。

什么时候选择 TCP Socket?

当你的应用对数据的可靠性要求极高,不容许数据丢失或出错时,TCP 就是不二之选。常见的应用场景包括:

  • HTTP/HTTPS 协议: 网页浏览,确保网页内容完整加载。
  • FTP (文件传输协议): 确保文件内容准确无误。
  • SMTP/POP3/IMAP (邮件协议): 保证邮件的可靠收发。
  • 数据库连接: 如 JDBC 底层,保证 SQL 指令和数据的准确传递。
  • 大多数需要确保数据完整性的业务应用。

Java 中 TCP Socket 的初步印象:

在 Java 中,我们使用 java.net.ServerSocket 来创建服务器端 TCP Socket,用于监听客户端的连接请求;使用 java.net.Socket 来创建客户端 TCP Socket,用于发起连接和进行数据通信。

// 服务器端 TCP Socket 概念代码
import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.io.OutputStream;
import java.io.InputStream;

public class SimpleTcpServerConcept {
   
   
    public static void main(String[] args) {
   
   
        int port = 12345; // 服务器监听的端口号
        try (ServerSocket serverSocket = new ServerSocket(port)) {
   
    // 1. 创建 ServerSocket
            System.out.println("服务器启动,正在监听端口: " + port);

            // 2. 等待客户端连接 (accept() 方法是阻塞的,直到有客户端连接进来)
            Socket clientSocket = serverSocket.accept(
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PGFA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值