什么是 TCP 和 UDP?Java 中如何实现 TCP 和 UDP 协议

news2025/3/9 22:04:47

在计算机网络中,TCP(传输控制协议)和UDP(用户数据报协议)是两种最常用的传输层协议。它们都用于在网络上传输数据,但是它们之间有很多不同之处。本文将介绍TCP和UDP的基本概念,以及在Java中如何实现TCP和UDP协议。

在这里插入图片描述

什么是TCP和UDP?

TCP和UDP都是传输层协议,用于在网络上传输数据。它们都是在IP协议之上构建的协议,因此它们都需要IP地址和端口号来标识网络中的设备和应用程序。

TCP

TCP是一种面向连接的协议,它提供了可靠的数据传输。在TCP连接中,数据被分割成多个数据包,并通过网络传输。每个数据包都有一个序号和确认号,用于检测数据包是否丢失或损坏。如果一个数据包丢失或损坏,TCP会重新发送该数据包,直到接收方确认收到为止。TCP还提供了流控制和拥塞控制机制,以确保网络不会过载或崩溃。

UDP

UDP是一种无连接的协议,它提供了不可靠的数据传输。在UDP中,数据被分割成多个数据包,并通过网络传输。每个数据包都有一个源端口和目标端口,但没有序号和确认号。如果一个数据包丢失或损坏,UDP不会重新发送该数据包。UDP不提供流控制和拥塞控制机制,因此在网络拥塞或负载过高的情况下,可能会导致数据包丢失或延迟。

Java中的TCP和UDP

在Java中,可以使用Socket类和DatagramSocket类来实现TCP和UDP协议。Socket类用于TCP协议,DatagramSocket类用于UDP协议。以下是TCP和UDP协议在Java中的实现示例。

TCP

以下是一个使用Socket类实现TCP协议的示例。在这个示例中,我们创建了一个服务器和一个客户端。客户端向服务器发送消息,服务器接收并响应消息。

服务器端代码

import java.io.*;
import java.net.*;

public class TCPServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("Server started.");

        while (true) {
            Socket clientSocket = serverSocket.accept();
            System.out.println("Connected: " + clientSocket);

            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

            String inputLine, outputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.println("Received message: " + inputLine);
                outputLine = "Server: " + inputLine;
                out.println(outputLine);
                if (outputLine.equals("Bye."))
                    break;
            }

            clientSocket.close();
            System.out.println("Client disconnected.");
        }
    }
}

客户端代码

import java.io.*;
import java.net.*;

public class TCPClient {
    public static void main(String[] args) throws IOException {
        String serverHostname = "localhost";
        int serverPort = 9999;

        Socket socket = new Socket(serverHostname, serverPort);

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String userInput;
        while ((userInput = stdIn.readLine()) != null) {
            out.println(userInput);
            System.out.println("Sent message: " + userInput);
            String receivedMessage = in.readLine();
            System.out.println("Received message: " + receivedMessage);
            if (receivedMessage.equals("Bye."))
                break;
        }

        socket.close();
        System.out.println("Connection closed.");
    }
}

在这个示例中,我们创建了一个ServerSocket对象,它绑定到9999端口,然后等待客户端连接。当客户端连接后,服务器会创建一个Socket对象,并使用这个Socket对象的输入流和输出流来和客户端通信。当服务器从客户端接收到消息后,它会将消息添加前缀“Server: ”并返回给客户端。

客户端首先连接到服务器,然后从标准输入中读取输入,并将它发送给服务器。客户端还从服务器接收响应,并将其打印到控制台上。

UDP

以下是一个使用DatagramSocket类实现UDP协议的示例。在这个示例中,我们创建了一个服务器和一个客户端。客户端向服务器发送消息,服务器接收并响应消息。

服务器端代码

import java.io.*;
import java.net.*;

public class UDPServer {
    public static void main(String[] args) throws IOException {
        DatagramSocket serverSocket = new DatagramSocket(9999);
        System.out.println("Server started.");

        byte[] receiveData = new byte[1024];
        byte[] sendData = new byte[1024];

        while (true) {
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            serverSocket.receive(receivePacket);

            String message = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("Received message: " + message);

            InetAddress IPAddress = receivePacket.getAddress();
            int port = receivePacket.getPort();
            String responseMessage = "Server: " + message;
            sendData = responseMessage.getBytes();

            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
            serverSocket.send(sendPacket);

            if (responseMessage.equals("Server: Bye.")) {
                System.out.println("Client disconnected.");
                break;
            }
        }

        serverSocket.close();
    }
}

客户端代码

import java.io.*;
import java.net.*;

public class UDPClient {
    public static void main(String[] args) throws IOException {
        String serverHostname = "localhost";
        int serverPort = 9999;

        DatagramSocket clientSocket = new DatagramSocket();

        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
        InetAddress IPAddress = InetAddress.getByName(serverHostname);

        byte[] sendData = new byte[1024];
        byte[] receiveData = new byte[1024];

        String userInput;
        while ((userInput = inFromUser.readLine()) != null) {
            sendData = userInput.getBytes();

            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, serverPort);
            clientSocket.send(sendPacket);
            System.out.println("Sent message: " + userInput);

            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            clientSocket.receive(receivePacket);

            String receivedMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("Received message: " + receivedMessage);

            if (receivedMessage.equals("Server: Bye.")) {
                System.out.println("Connection closed.");
                break;
            }
        }

        clientSocket.close();
    }
}

在这个示例中,我们创建了一个DatagramSocket对象,并绑定到9999端口。服务器从客户端接收消息,并将消息添加前缀“Server: ”并返回给客户端。

客户端创建一个DatagramSocket对象,并向服务器发送消息。客户端还从服务器接收响应,并将其打印到控制台上。

总结

TCP和UDP是计算机网络中最常用的传输层协议。TCP是一种面向连接的协议,提供可靠的数据传输。UDP是一种无连接的协议,提供不可靠的数据传输。

在Java中,可以使用Socket类和DatagramSocket类来实现TCP和UDP协议。TCP协议使用Socket类,UDP协议使用DatagramSocket类。在代码编写过程中,需要注意正确处理异常和及时关闭Socket和DatagramSocket对象,以避免资源泄露和数据丢失等问题。

以上是TCP和UDP协议在Java中的实现示例,希望能对您有所帮助。

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

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

相关文章

一、基础-4、MySQL启动和客户端连接

一、启动 方法一: 1、winR,输入services.msc,按回车 2、找到MySQL,右键-启动/停止 MySQL安装后,默认已启动。 方法二、 1、winR,输入cmd,打开命令行 2、输入启动与停止命令 二、客户端连接 …

港联证券-“肉签”频出!这周打新看TA们→

近期,新股市场有所回暖,“赚钱效应”随之提高。Choice数据显现,上星期8只新股的上市首日均匀涨幅为56%,呈逐周上涨态势。其中,赛维年代首日大涨115.11%,中一签约可赚1.2万元;昊帆生物、英华特、…

ShardingSphere项目实战集群环境准备

🚀 ShardingSphere 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜&…

React06-简单实战案例

一、计时器 1. 案例场景 计时器在很多网站中都有使用,以时分秒的格式展示当前时间,每秒刷新一次。 2. 案例展示 展示的时间将随着系统时间,每秒刷新一次。 3. 案例代码 import { useState, useEffect } from react;export default func…

golang中的【数组】相关知识点

目录 数组含义数组定义形式数组的声明初始化方式数组变量的类型 arr的特征数组的遍历遍历的用法二数组的值传递数组的引用&取地址 传送二维数组的相关操作定义二维数组初始化遍历 Golang是一种高效的编程语言,具有很多特性和优点,其中之一就是其对数…

查看服务器GPU使用情况,以及使用GPU的用户

查看服务器GPU使用情况,以及使用GPU的用户 1.查看gpu使用情况 nvidia-smi2.查看是谁在占用gpu ps -f -p PID例如 ps -f -p 1986875就可以看到是谁在用了

谷歌发布ALBERT V2和中文模型

2019年9月推出时,谷歌的ALBERT语言模型在GLUE、RACE和SQuAD 2.0等流行的自然语言理解(NLU)基准上取得了SOTA结果。谷歌现在发布了一个主要的V2 ALBERT更新和开源的中国ALBERT模型。 正如全名“A Lite BERT”所示,ALBERT是该公司B…

组件的状态

组件的状态 react hook出来之前,函数式组件是没有自己状态的。 ​ jsx 就和原生js编写差不多,所有就当作在定义类,在类方法中使用变量,就要通过this来调用。 ​ 主义要写在state中,数据驱动视图,我们想要修…

Vite 3.0 核心盘点与分析

自2021 年2月,Vite 2.0版本发布以来,Vite项目在的用户量方面发生了非常迅速的增长,很快达到了每周 100 万的npm下载量,成为npm下载量最高的几个项目之一。同时,Vite 的社区也越来越活跃,目前已经形成非常庞…

如何用手机实现三维可视化

三维可视化是一种强大的工具,可以将复杂的数据、概念或场景以直观、具体的形式展现出来。它将数据或模型转化成三维图像,使人们能够更清晰地理解和分析其中的关系和特征。三维可视化不仅可以用于科学研究和工程设计,还广泛应用于教育、娱乐和…

linux内核调试工具记录

Linux性能测试使用的工具在github网站可见,网址如下: slides: http://www.slideshare.net/brendangregg/linux-performance-analysis-new-tools-and-old-secrets video: https://www.usenix.org/conference/lisa14/conference-program/presentation/greg…

在线考试系统源码搭建:springboot+mybatis+mysql+vue

下载源码 在线考试 刷题小程序 题库答题小程序 : 适用机构场景:在线考试系统适用于企业考核、员工职评测、培训机构考证刷题等场景;用户端功能:顺序练习,真题模拟,我的错题,我的收藏、错题重练(答对自动移…

【Atcoder】 [ARC156C] Tree and LCS

题目链接 Luogu方向 Atcoder方向 题目解法 手玩几个小数据之后可以猜测最小的最大相似度一定为1 考虑构造:每次找到2个叶子,交换权值,然后删掉(最后如果剩下一个点权值不变) 证明: 首先可以证明最大的相…

【微服务实战之Docker容器】第三章-镜像仓库

系列文章目录 【微服务实战之Docker容器】第一章-下载及安装 文章目录 系列文章目录Docker镜像提交本地镜像发布到阿里云阿里云镜像下载到本地使用本地镜像发布到私有库 Docker镜像提交 docker commit提交容器副本使之成为一个新的镜像docker commit -m“提交的描述信息” -a…

2023年网络安全需把握十大趋势

过去的2022年,网络安全继续成为全社会的关注焦点。网络战在俄乌冲突中风头尽出;勒索攻击给企业造成的损失触目惊心;数据泄露事件愈发频繁、甚至威胁社会安全;供应链攻击无处不在……网络安全已经成为发展的先决条件。 2023年是贯…

【大模型】AutoDL 快速使用

网站:https://www.autodl.com/ BUY 性价比之选:NVIDIA RTX A5000 / 24GB PS:CUDA版本 -12.0 PS:Pytorch/2.0.0/3.8(ubuntu20.04)/11.8 Use Tips git clone 慢 学术资源加速 source /etc/network_turbo切换pip 阿里源

TCP文件传输功能

实现代码 tcp.h #ifndef _TCP_H_ #define _TCP_H_#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/tcp.h> #include <strings.h> #include <…

链表的简单示意

链表的实质就是指针。存放下一个元素的地址。 typedef struct spy {char * name ;struct spy * next; }spy ,*p_spy;spy A {A,NULL}; spy B {B,NULL}; spy C {C,NULL};int main() {p_spy &A;A.next&B;//A是一个结构体变量&#xff0c;A.next是对这个结构体变量的引用。…

MySQL八股学习记录4事务的实现from小林coding

MySQL八股学习记录4事务的实现from小林coding 事务的概念与特性并行事务引发的问题脏读不可重复读幻读 MySQL的应对策略InnoDB引擎可重复读详解ReadView在MVCC中的工作方式两种隔离级别通过MVCC实现幻读被完全解决了吗 事务的概念与特性 概念:一个操作要么执行成功,要么回滚到…

Matplotlib subplots()函数详解

matplotlib.pyplot模块提供了一个 subplots() 函数&#xff0c;它的使用方法和 subplot() 函数类似。其不同之处在于&#xff0c;subplots() 既创建了一个包含子图区域的画布&#xff0c;又创建了一个 figure 图形对象&#xff0c;而 subplot() 只是创建一个包含子图区域的画布…