【Java网络编程】TCP通信(Socket 与 ServerSocket)和UDP通信的三种数据传输方式

目录

1、TCP通信

1.1、Socket 和 ServerSocket

1.3、TCP通信示例

2、UDP的三种通信(数据传输)方式

1、TCP通信

TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象

        通信之前要保证连接已经建立(注意TCP是一定要建立连接的)

        TCP是通过Socket产生I0流来进行网络通信的,所以发送端和接收端的两个流的方向是不一样的,比如客户端和服务器进行通信(通信前要确保建立了连接),然后客户端向服务器发送了“你好帅”,这一次发送数据的过程,它们流的方向是不一样的,针对客户端来说,它是往外发所以用的是输出流,而针对服务器来说,它是接收数据所以用的是输入流。

1.1、Socket 和 ServerSocket

        socket可以使一个应用从网络中读取和写入数据,不同计算机上的两个应用可以通过连接发送和接受字节流,当发送消息时,你需要知道对方的ip和端口,在java中,socket指的是java.net.Socket类。

        一旦成功创建一个Socket类的实例,可以用它来发送和接收字节流,发送时调用getOutputStream方法获取一个java.io.OutputStream对象,接收远程对象发送来的信息可以调用getInputStream方法来返回一个java.io.InputStream对象。

        Socket类代表一个客户端套接字,即任何时候连接到一个远程服务器应用时构建所需的socket。现在,要实现一个服务器应用,需要不同的做法。服务器需随时待命,因为不知道客户端什么时候会发来请求,此时,我们需要使用ServerSocket,对应的是java.net.ServerSocket类。 
  ServerSocket与Socket不同,ServerSocket是等待客户端的请求,一旦获得一个连接请求,就创建一个Socket示例来与客户端进行通信。 

1.3、TCP通信示例

(1)写TCP通信的步骤:

客户端:

        创建客户端的Socket对象(Socket)与指定服务端连接:Socket(string host,int port)--host为服务器ip地址,port为端口

获取输出流,写数据:OutputStream getoutputstream()

释放资源:void close()

服务器:

创建服务器端的Socket对象(ServerSocket):Serversocket(int port)

监听客户端连接,返回一个Socket对象:Socket accept()

获取输入流,读数据,并把数据显示在控制台:InputStream getInputStream()

释放资源:void close()

示例:

提示:在客户端创建了Socket对象的同时会去连接服务端,如果连接不上,代码会报错;用来通信的I0流可以关可不关,因为这个流是TCP连接通道里的流,关闭TCP连接通道时这个流自然就关了

客户端代码

public class Client {public static void main(String[] args) throws IOException {//TCP协议,发送数据// 1.创建Socket对象// 提示:在创建对象的同时会连接服务端,如果连接不上,代码会报错Socket socket = new Socket("127.0.0.1",10001);//2.可以从连接通道中获取输出流(OutputStream是引用型数据类型)OutputStream os = socket.getOutputStream();//写出数据//os.write("aaa".getBytes());os.write("你好aaa是吧".getBytes());//3.释放资源os.close();//这里的流可以关可不关,因为这个流是TCP连接通道里的流,关闭TCP连接通道时这个流自然就关了socket.close();}
}

服务器代码

public class Server {public static void main(String[] args) throws IOException {//TCP协议,接收数据// 1.创建对象ServerSocketServerSocket ss = new ServerSocket(10001);//2.监听客户端的链接Socket socket = ss.accept();//3.从连接通道中获取输入流读取数据InputStreamReader br = new InputStreamReader(socket.getInputStream());//这时候才能正确的读取到中文数据int b;while ((b = br.read()) != -1) {System.out.print((char) b);}//4.释放资源br.close();//这里的流可以关可不关,因为这个流是TCP连接通道里的流,关闭TCP连接通道时这个流自然就关了ss.close();}
}

先运行服务器,再运行客户端

结果结果

(2)客户端不断发送消息

客户端代码

public class Client {public static void main(String[] args) throws IOException {//客户端:多次发送数据//服务器:接收多次接收数据,并打印//1.创建Socket对象Socket socket = new Socket("127.0.0.1",10001);//2.可以从连接通道中获取输出流(OutputStream是引用型数据类型)OutputStream os = socket.getOutputStream();Scanner sc = new Scanner(System.in);while (true) {System.out.println("输入要发送的数据:");String str = sc.nextLine();if ("886".equals(str)) {break;}//写出数据os.write(str.getBytes());}//3.释放资源socket.close();}
}

服务器代码

public class Server {public static void main(String[] args) throws IOException {//客户端:多次发送数据//服务器:接收多次接收数据,并打印// 1.创建对象ServerSocketServerSocket ss = new ServerSocket(10001);//2.监听客户端的链接Socket socket = ss.accept();//3.从连接通道中获取输入流读取数据InputStreamReader br = new InputStreamReader(socket.getInputStream());int b;while ((b = br.read()) != -1) {System.out.print((char) b);}//4.释放资源ss.close();}
}

运行结果:客户端发送886后结束通信

(3)客户端和服务器互发互收消息

//客户端代码
public class Client {public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1",10001);OutputStream os = socket.getOutputStream();String str = "你看的到我发信息吗?";os.write(str.getBytes());//往服务器写出结束标记,shutdownOutput()是关闭输出流,如果不关闭,服务器那边的输入流就不会关闭,就会继续阻塞在读信息的过程中socket.shutdownOutput();InputStreamReader br = new InputStreamReader(socket.getInputStream());int b;while ((b = br.read()) != -1) {System.out.print((char) b);}socket.close();}
}//服务器代码
public class Server {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(10001);Socket socket = ss.accept();InputStreamReader br = new InputStreamReader(socket.getInputStream());int b;while ((b = br.read()) != -1) {System.out.print((char) b);}socket.getOutputStream().write("是的,我看到了。".getBytes());//链式编程//写出结束标记,shutdownOutput()是关闭输出流socket.shutdownOutput();socket.close();ss.close();}
}

运行结果

服务器端:

客户端:

2、UDP的三种通信(数据传输)方式

Java网络编程中的UDP(User Datagram Protocol)通信编程支持单播、组播和广播这三种方式。

  • 单播(Unicast):单播是指将数据从一个发送者发送到一个接收者的传输方式。在UDP编程中,通过指定目标主机的IP地址和端口号,可以实现单播通信。
  • 组播(Multicast):组播是指将数据从一个发送者发送到一组特定的接收者的传输方式。在UDP编程中,可以使用Java的MulticastSocket类来支持组播通信。
  • 广播(Broadcast):广播是指将数据从一个发送者发送到网络中的所有设备的传输方式。在UDP编程中,可以通过指定广播地址(通常是特定的子网地址)来实现广播通信。

单播:前面的发送接收数据的通信方式就是单播

组播:组播地址:224.0.0.0~239.255.255.255;其中224.0.0.0~224.0.0.255为预留的组播地址

广播:广播地址:255.255.255.255

UDP组播示例:

//发送端代码
public class SendMessageDemo {public static void main(String[] args) throws IOException {//组播发送端代码// 创建MulticastSocket对象MulticastSocket ms = new MulticastSocket();String str = "你好,你好!";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("224.0.0.2");//这里设置的ip为组播地址int port = 10000;DatagramPacket dp = new DatagramPacket(bytes, bytes.length,address,port);//调用MulticastSocket发送数据方法发送数据ms.send(dp);//释放资源ms.close();}
}//接收端代码
public class ReceiveMessageDemo1 {public static void main(String[] args) throws IOException {//1.创建MulticastSocket对象,并且设置端口为10000MulticastSocket ms = new MulticastSocket(10000);//2.将将当前本机,添加到224.0.0.1的这一组当中InetAddress address = InetAddress.getByName("224.0.0.2");ms.joinGroup(address);byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);//接收数据包ms.receive(dp);//3.解析数据包byte[] data = dp.getData();//获取数据包dp中的数据int len = dp.getLength();//获取这次收到了多少个字节的数据String str = new String(data,0,len);//因为字节数组data的长度是1024,太大了,所以要用到这次收到了多少个字节的数据个数len来决定把字节数组data中的多少数据转换成字符串String ip = dp.getAddress().getHostAddress();//ipString name = dp.getAddress().getHostName();//主机名System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + str);//释放资源ms.close();}
}

要想运行并验证这个示例,修要允许运行多个发送端,步骤如下:

完成这些操作后,多运行几个接收端就可以了

发送端运行结果

接收端1显示结果

接收端2显示结果

UDP广播示例:

发送端把目的主机的IP设置为:255.255.255.255,这就是广播了

public class SendMessageDemo {public static void main(String[] args) throws IOException {/*按照下面的要求实现程序UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收*///1.创建对象DatagramSocket的对象DatagramSocket ds = new DatagramSocket();Scanner sc = new Scanner(System.in);while (true) {System.out.println("请输入你想说的话:");String str = sc.next();byte[] bytes = str.getBytes();//InetAddress address = InetAddress.getByName("127.0.0.1");//设置目标主机的IP为:127.0.0.1,这是单播方式InetAddress address = InetAddress.getByName("255.255.255.255");//设置目标主机的IP为:255.255.255.255,这是广播方式int port = 10086;//设发送到目标主机的10086端口//2.打包数据DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//3.发送数据ds.send(dp);if ("886".equals(str)) {//如果输入的数据是886,发送数据结束break;}}//4.释放资源ds.close();}
}

推荐:

【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/137928825?spm=1001.2014.3001.5501

【java多线程】线程池 ThreadPoolExecutor类和Executors工厂类以及线程池的最优大小_threadpool 线程池工厂类-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/137673188?spm=1001.2014.3001.5501

【Spring】依赖注入(DI)时常用的注解@Autowired和@Value-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/137784706?spm=1001.2014.3001.5501

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

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

相关文章

【Interconnection Networks 互连网络】Torus 网络拓扑

1. Torus 网络拓扑2. Torus 网络拓扑结构References 1. Torus 网络拓扑 Torus 和 Mesh 网络拓扑,又可以称为 k-ary n-cubes,在规则的 n 维网格中包裹着 N k^n 个节点,每个维度都有 k 个节点,并且最近邻居之间有通道。k-ary n-c…

YOLOv9有效改进专栏汇总|未来更新卷积、主干、检测头注意力机制、特征融合方式等创新![2024/4/21]

​ 专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,助力高效涨点!!! 专栏介绍 YOLOv9作为最新的YOLO系列模型,对于做目标检测的同学是必不可少的。本专栏将针对2024年最新推出的YOLOv9检测模型&#xff0…

《HCIP-openEuler实验指导手册》1.3Apache动态功能模块加载卸载练习

1.3.1 配置思路 mod_status 模块可以帮助管理员通过web界面监控Apache运行状态,通过LoadModule指令加载该模块,再配置相关权限,并开启ExtendedStatus后,即可使用该模块。 1.3.2 配置步骤 检查mod_status模块状态(使…

net模块

建立TCP的链接 1 发送消息的服务 2 接收消息 2 建立http的链接让浏览器进行访问 import net from netconst html <h1>TCP</h1>const respinseHeaders [HTTP/1.1 200 OK,Content-Type:text/html,Content-Length: html.length,\r\n,html]const http net.create…

RK3568 学习笔记 : u-boot 通过 tftp 网络更新 u-boot自身

前言 开发板型号&#xff1a; 【正点原子】 的 RK3568 开发板 AtomPi-CA1 使用 虚拟机 ubuntu 20.04 收到单独 编译 RK3568 u-boot 使用 rockchip Linux 内核的设备树 【替换】 u-boot 下的 rk3568 开发板设备树文件&#xff0c;解决 u-boot 下千兆网卡设备能识别但是无法 Pi…

Spring(下)

接上篇&#xff0c;从第八个问题讲起 八.Spring工厂创建复杂对象 1.什么是复杂对象 简单对象就是可以直接new出来的&#xff0c;也就是直接调用构造方法创建 所以复杂对象就是不能直接通过调用构造方法创建。就比如JDBC中的Connection 2.三种方法 &#xff08;1&#xff…

【华为 ICT HCIA eNSP 习题汇总】——题目集18

1、SSH默认工作使用的TCP端口号是&#xff08;&#xff09;。 A、20 B、21 C、22 D、23 考点&#xff1a;①传输层 ②应用层 解析&#xff1a;&#xff08;C&#xff09; SSH为建立在应用层和传输层上的安全协议&#xff0c;是对TCP/IP协议的传输层以上的SSH会话流程进行加密的…

必应搜索广告与谷歌搜索广告对比那个更好?

搜索引擎广告作为企业获取潜在客户的重要渠道之一&#xff0c;其效果直接关系到营销策略的成功与否。两大搜索引擎巨头——谷歌&#xff08;Google&#xff09;和必应&#xff08;Bing&#xff09;各自提供了广告平台&#xff0c;即谷歌广告&#xff08;Google Ads&#xff09;…

【Web】2022DASCTF X SU 三月春季挑战赛 题解(全)

目录 ezpop calc upgdstore ezpop 瞪眼看链子 fin#__destruct -> what#__toString -> fin.run() -> crow#__invoke -> fin#__call -> mix.get_flag() exp <?php class crow {public $v1;public $v2;}class fin {public $f1; }class what {public $a; }…

力扣hot100(python解析)

文章目录 13. 合并区间14. 轮转数组 13. 合并区间 合并区间 数组 排序 思路&#xff1a; 代码&#xff1a; class Solution:def merge(self, intervals):result []if len(intervals) 0:return result # 区间集合为空直接返回intervals.sort() # 默认按照区间的左边界进…

z3求解器脚本(CTF-reverse必备)

CTF-reverse中有一类题目是通过约束方程求解变量的值&#xff0c;然后转化为对应的ASCII码&#xff0c;最终获得flag&#xff0c;约束方程以及要求解的未知数往往非常多&#xff0c;因此手算十分不现实&#xff0c;借助python中的z3模块可以很快完成求解&#xff01; 下面是某道…

开始Java之旅

1.Java语言 java是一门优秀的程序设计语言&#xff0c;并且是一种半编译型&#xff0c;半解释型语言。 Java 语言源于 1991 年 4 月&#xff0c;Sun 公司 James Gosling博士 领导的绿色计划(Green Project) 开始启动&#xff0c;此计划最初的目标是开发一种能够在各种消费性电…

【分治算法】Hanoi塔问题Python实现

文章目录 [toc]问题描述Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python基础 学习指南&#xff1a;Python学习指南 问题描述 设 a a a、 b b b、 c c c是三个塔座&#xff0c;开始时&#xff0c;在塔座 a a a上有一叠共 n n n个圆盘&#xff0c;这些圆盘…

最新免费 ChatGPT、GPTs、AI换脸(Suno-AI音乐生成大模型)

&#x1f525;博客主页&#xff1a;只恨天高 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ ChatGPT3.5、GPT4.0、GPTs、AI绘画相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容…

虚良SEO怎么有效的对百度蜘蛛权重优化?

人们交换链接通常首先要问的是你BR值是多少&#xff1f;国内搜索引擎来说以百度马首是瞻&#xff0c;无论seo还是竞价都看重的是百度&#xff0c;那么针对百度权重的优化就特别重要了。其实&#xff0c;百度权重是民间的一种说法&#xff0c;百度官方并没有认同这个数值&#x…

(回溯)记忆化搜索和dp

动态规划的核心就是 状态的定义和状态的转移 灵神 的 回溯改递归思路 首先很多动态规划问题都可以采用 回溯 的思想 回溯主要思想就是把 一个大问题分解成小问题 比如 采用子集类回溯问题中的核心思想-> 选或不选 或者 选哪个 记忆化搜索之后 我们可以发现 每个新节点依…

Oracle故障处理:ORA-00600错误处理思路

提前说明&#xff1a; 该故障&#xff0c;我只是旁观者。 但处理该故障的DBA工程师&#xff0c;思路很清晰&#xff0c;我非常受教&#xff01;在此也将经验分享。 目录 项目场景 问题分析 优化建议 项目场景 在某项目数据库运维群&#xff0c;有现场同事发了张报错截图如下…

代码学习记录49---单调栈

随想录日记part49 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.20 主要内容&#xff1a;今天开始要学习单调栈的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;柱状图中最大的矩形 84.柱状图中最大的矩形 Topic184.柱状图中最大的矩形 题目&…

Scikit-Learn支持向量机分类

Scikit-Learn 支持向量机分类 1、支持向量机&#xff08;SVM&#xff09;1.1、SVM概述1.2、SVM原理1.3、SVM的损失函数1.4、支持向量机分类的优缺点 2、Scikit-Learn支持向量机分类2.1、Scikit-Learn支持向量机分类API2.2、支持向量机分类初体验&#xff08;手写数字识别&#…

四川易点慧电子商务抖音小店:安全正规,购物新选择

在当今互联网高速发展的时代&#xff0c;电子商务已经成为人们日常购物的重要组成部分。四川易点慧电子商务抖音小店作为新兴的电商平台&#xff0c;凭借其安全正规的经营理念和便捷高效的购物体验&#xff0c;正逐渐赢得消费者的信赖和喜爱。 一、平台背景实力雄厚 四川易点慧…