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

在计算机网络中,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.mzph.cn/news/1359.shtml

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

相关文章

ubuntu20.04配置vscode

下载: https://az764295.vo.msecnd.net/stable/660393deaaa6d1996740ff4880f1bad43768c814/code_1.80.0-1688479026_amd64.debhttps://az764295.vo.msecnd.net/stable/660393deaaa6d1996740ff4880f1bad43768c814/code_1.80.0-1688479026_amd64.deb 安装&#xff1a…

Ubuntu 放弃了战斗向微软投降

导读这几天看到 Ubuntu 放弃 Unity 和 Mir 开发,转向 Gnome 作为默认桌面环境的新闻,作为一个Linux十几年的老兵和Linux桌面的开发者,内心颇感良多。Ubuntu 做为全世界Linux界的桌面先驱者和创新者,突然宣布放弃自己多年开发的Uni…

回首2023上半年:成长、思考、感恩

文章目录 每日一句正能量前言一、目标达成情况总结二、工作和学习成果总结三、下半年规划总结四、个人想法 后记附录 每日一句正能量 做一个向日葵族,面对阳光,不自艾自怜,每天活出最灿烂的自己。曾经拥有的,不要忘记。不能得到的…

day52

思维导图 比较指令结果的条件码 练习 汇编实现1-100的累加 .text .global _strat _start: mov r0,#0mov r1,#0 add_fun:add r0,r0,#1cmp r0,#100addls r1,r1,r0bls add_fun .end

Vue 项目路由、自定义指令、api方法自动引入资源(require.context使用)

前端项目(当前我以Vue项目为例)当我们把api挂载在main上后 // 将api挂载到vue的原型上 import api from /api Vue.prototype.$apiapi在src下会有一个api文件夹,结构如下: 通常情况下,api文件夹的index.js文件我们通常…

ChatGPT 最佳实践指南之:使用外部工具

Use external tools 使用外部工具 Compensate for the weaknesses of GPTs by feeding them the outputs of other tools. For example, a text retrieval system can tell GPTs about relevant documents. A code execution engine can help GPTs do math and run code. If a …

8.postgresql--Update join 和 Delete using

Update join Update join用于基于另一张表更新表数据,语法如下: UPDATE t1 SET t1.c1 new_value FROM t2 WHERE t1.c2 t2.c2;CREATE TABLE product_segment (id SERIAL PRIMARY KEY,segment VARCHAR NOT NULL,discount NUMERIC (4, 2) );INSERT INTO…

基于C/S架构工作原理序号工作步骤和理论的区别

基于C/S架构工作原理序号工作步骤和理论的区别 SSH 概念 对称加密linux 系统加密,就是加密和揭秘都是使用同一套密钥。 非对称加密有两个密钥:“私钥”和“公钥”。私钥加密后的密文,只能通过对应的公钥进行揭秘。而通过私钥推理出公钥的…

不满足于RPC,详解Dubbo的服务调用链路

系列文章目录 【收藏向】从用法到源码,一篇文章让你精通Dubbo的SPI机制 面试Dubbo ,却问我和Springcloud有什么区别? 超简单,手把手教你搭建Dubbo工程(内附源码) Dubbo最核心功能——服务暴露的配置、使用…

数据可视化——用python绘制简单的折线图

文章目录 前言JSON使用 pyecharts 模块绘制折线图下载 pyecharts 模块使用 pyecharts 模块绘制简单的折线图添加配置选项 前言 前面我们已经学习了python的基础语法和面向对象,那么接下来我们将学习python编程语言的过人之处——数据的可视化之折线图。 JSON 说到…

C/C++内存泄漏原因分析与应对方法

内存泄漏 一、内存泄漏的危害: 内存泄漏会导致当前应用程序消耗更多的内存,使得其他应用程序可用的内存更少了。 如果有个进程可用的内存不够,就会触发Linux操作系统的直接/后台内存回收(即将一些内存页的数据写到磁盘里&#…

springboot服务端接口公网远程调试,并实现HTTP服务监听

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

Argo CD 入门扫盲使用

目录 一、什么是 argo cd 二、为什么使用 argo cd 三、argo cd 架构图 四、Argo CD 使用 1、安装 Argo CD 2、安装 Argo CD CLI 3、发布 Argo CD 服务 4、获取 Argo CD 密码 5、准备 Git 仓库 6、创建 Argo CD App 7、版本升级 8、版本回滚 一、什么是 argo cd A…

数据结构(王道)——线性表的存储结构之循环表

一、循环单链表 定义: 循环单链表代码实现 创建并初始化、判断循环单链表是否为空、判断结点p是否为循环单链表的表尾结点的代码操作。 二、循环双链表 定义: 循环双链表代码实现 创建并初始化、判断循环双链表是否为空、判断结点p是否为循环双链表的…

JVM重点整理

一、虚拟机架构图 二、类加载过程 类加载器的作用:负责把class文件加载到内存中 类加载过程: 加载: 通过类的全限定名获取此类的二进制字节流文件的编码结构---->运行时的内存结构内存中生成一个class对象 链接: 验证&#x…

智能电表远程抄表系统原理

智能电表远程抄表系统是现代智能电网建设的重要组成部分,它利用物联网技术实现电表数据的远程采集、传输和处理,提高了电力公司的抄表效率,同时也为用户提供了更加便捷、准确的用电服务。本文将从远程智能电表抄表系统的工作原理、特点、应用…

每天一道C语言编程:排队买票

题目描述 有M个小孩到公园玩,门票是1元。其中N个小孩带的钱为1元,K个小孩带的钱为2元。售票员没有零钱,问这些小孩共有多少种排队方法,使得售票员总能找得开零钱。注意:两个拿一元零钱的小孩,他们的位置互…

精益生产有哪些管理工具?

精益生产有哪些管理工具? 一、什么是精益生产 智能制造是落实我国制造强国战略的重要举措,加快推进智能制造,是加速我国工业化和信息化深度融合、推动制造业供给侧结构性改革的重要着力点,对重塑我国制造业竞争新优势具有重要意义…

优化类问题建模解析

模型建立阶段 线性规划模型:目标函数和约束条件均为线性 整数规划或0-1规划:决策变量取值被限制为整数或0、1 动态优化模型:以时间为划分阶段的动态过程优化问题 非线性规划模型:目标函数或约束条件中包括非线性函数 多目标规划模…

超高性能协议框架fury完爆protostuff(附性能测试对比)

简单介绍: 序列化框架是系统通信的基础组件,在大数据、AI 框架和云原生等分布式系统中广泛使用。当对象需要跨进程、跨语言、跨节点传输、持久化、状态读写、复制时,都需要进行序列化,其性能和易用性影响运行效率和开发效率。 Fury 是一个基于…