目录
注意:要先开启接收数据,再开启发送数据因为发送数据不管有没有程序接收,他都会发送,如果先运行发送数据,可能会造成数据都发完了,接收数据才开始运行。容易造成数据丢失。
单播——聊天室(群聊)——>多个人一起发消息,只有一个容器接收。一般使用本机IP ——127.0.0.1
发送数据:(随机/指定) 快递公司——>将东西打包装箱——>将快递派送——>快递公司离开
-1- 找快递公司 —— 创建发送端的 DatagramSocket 对象
-2- 打包礼物 —— 数据打包( DatagramPacket )
接收数据:快递公司 根据地址 过来——>准备容器——>签收箱子——>拆开箱子得到里面的数据——>快递公司离开先运行接收数据,再运行发送数据,
-1- 快递公司 根据地址 过来 —— 创建接收端的 DatagramSocket 对象
-3- 签收箱子 —— 接收打包好的数据 ——>receive()
应用场景——聊天室——>CSDN链接 :http://t.csdnimg.cn/2uNle ——>IDEA文件:package com.itheima.a03udpdemo2;
发送数据: 创建老师——>准备教材内容——>确定教室——>汇总信息——>开始讲课——>下课
-1- 创建老师——.创建MulticastSocket对象
-4- 汇总信息(资源包)——> 创建DatagramPacket 对象
接收数据:创建要学这一科目的学生——>获取教室信息——>到达教室——>准备接收资源包的位置和大小——>接收数据——>整理笔记——>下课
-1- 创建要学这一科目的学生(指定端口号)——.创建MulticastSocket对象
-2- 获取教室信息——获取区域地址——创建InetAddress对象
-3- 到达教室——加入这一区域地址中——>joinGroup()
-4- 准备接收资源包的位置和大小——创建DatagramPacket对象
广播——公开演讲,直播——>一个人发消息,所有人都能收到。广播地址:255.255.255.255
广播和单播实现过程一致,只是将接收端的电脑IP改为 255.255.255.255就可以
特点:TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,通信之前要保证连接已经建立,通过Socket产生I0流来进行网络通信
细节1:在创建对象的同时会连接服务端 如果连接不上,代码会报错细节2:IO流是在连接通道里面的。 通道方向从客户端到服务端,所以客户端是输出流,服务端是输入流
-1- 创建客户端的Socket对象(Socket)与指定服务端连接——>Socket(String host, int port)
-2- 获取输出流,写数据——> Outputstream getoutputstream()
-1- 创建服务器端的Socket对象(ServerSocket) ——> ServerSocket(int port)
-2- 监听客户端连接,返回一个Socket对象 ——> Socket accept()
-3- 获取输入流,读数据,并把数据显示在控制台 ——> InputStream getInputStream()
3. TCP 通信程序(四次挥手)——>确保连接断开,且数据处理完毕
构架图
-
1. UDP通信程序
不管对方能不能接收到,都要发-
注意:要先开启接收数据,再开启发送数据
因为发送数据不管有没有程序接收,他都会发送,如果先运行发送数据,可能会造成数据都发完了,接收数据才开始运行。容易造成数据丢失。
-
单播——聊天室(群聊)——>多个人一起发消息,只有一个容器接收。
一般使用本机IP ——127.0.0.1-
发送数据:(随机/指定) 快递公司——>将东西打包装箱——>将快递派送——>快递公司离开
-
-1- 找快递公司 —— 创建发送端的 DatagramSocket 对象
- 构造方法: DatagramSocket ds = new DatagramSocket();
绑定端口:以后我们就是通过这个端口往外发送- 空参:所有可用的端口中随机一个进行使用
- 有参:指定端口号使用(电脑的端口号)
- 构造方法: DatagramSocket ds = new DatagramSocket();
-
-2- 打包礼物 —— 数据打包( DatagramPacket )
- 构造方法: public DatagramPacket(byte buf[], int length, InetAddress address, int port)
参数:字符数组,数组的长度,InetAddress类型的IP地址(要接收的电脑IP地址),使用程序 对应的 端口号
- 指定IP地址(InetAddress address):public static InetAddress getByName(String host)
- 构造方法: public DatagramPacket(byte buf[], int length, InetAddress address, int port)
-
-3- 快递公司发送箱子 —— 发送数据——>send()
-
-4- 快递公司离开 —— 释放资源——>close()
-
-
接收数据:快递公司 根据地址 过来——>准备容器——>签收箱子——>拆开箱子得到里面的数据——>快递公司离开
先运行接收数据,再运行发送数据,-
-1- 快递公司 根据地址 过来 —— 创建接收端的 DatagramSocket 对象
- 构造方法: DatagramSocket ds = new DatagramSocket(发送端程序的端口号);
- 细节:在接收的时候,一定要绑定端口;而且绑定的端口一定要跟发送的程序端口保持一致
-
-2- 准备容器 —— 确定要放箱子的位置空间和大小
(和发送数据的 打包数据方法 一致,只是参数不同)- 构造方法: public DatagramPacket(byte buf[], int length) {}
参数: 接收数据的数组,要使用多长的数组长度(一般是全部长度)
- 构造方法: public DatagramPacket(byte buf[], int length) {}
-
-3- 签收箱子 —— 接收打包好的数据 ——>receive()
细节:该方法是阻塞的,程序执行到这一步的时候,会在这里等着直到 发送端 发送消息
-
-4- 从箱子里面获取礼物 —— 解析数据包
- 4.1 取出 容器中 的 data数据放进数组中——>getData()
- 4.2 确定实际数据的长度——>getLength()
- 4.3 确定发送数据的电脑IP——>getAddress()
发出数据的电脑的 IP地址(不是真的IP地址,只是和IP地址属性值相同的InetAddress类型)
要真正的 IP地址,需要再继续调用getHostAddress()返回 文本显示中的 IP地址字符串
- 4.4 确定发送数据的电脑端口号——>getPort()
如果发送端创建DatagramSocket对象时候指定了端口号(实参),返回值就一致;如果没有指定(空参),返回值就和发送端是一致的随机端口号
-
-5- 快递公司离开 —— 释放资源——>close()
-
-
应用场景——聊天室——>CSDN链接 :http://t.csdnimg.cn/2uNle ——>IDEA文件:package com.itheima.a03udpdemo2;
-
-
组播——老师讲课(一对多)——>一个人发消息,在教室的人(加入组播地址)才可以接收
组播地址:224.0.0.0~239.255.255.255其中224.0.0.0~224.0.0.255 为预留的组播地址-
发送数据: 创建老师——>准备教材内容——>确定教室——>汇总信息——>开始讲课——>下课
-
-1- 创建老师——.创建MulticastSocket对象
- 构造方法: MulticastSocket ms = new MulticastSocket();
空参:获取随机的电脑IP,接收端接收的电脑IP也是随机的- 空参:所有可用的端口中随机一个进行使用
- 有参:指定端口号使用(电脑的端口号)
- 构造方法: MulticastSocket ms = new MulticastSocket();
-
-2- 准备教材内容——创建要发送的字符串 转成 字节数组
-
-3- 确定教室——指定组播地址(区域地址)
数据发送到区域地址中,相同区域地址的接收端接收- 指定IP地址(InetAddress address):public static InetAddress getByName(String host)
此时不是指定的电脑IP地址,而是组播地址(区域地址,可以让多个电脑添加)
- 指定端口号——>port
- 指定IP地址(InetAddress address):public static InetAddress getByName(String host)
-
-4- 汇总信息(资源包)——> 创建DatagramPacket 对象
- 构造方法:public DatagramPacket(byte buf[], int length, InetAddress address, int port) {}
参数:字节数组,数组长度,IP地址,程序端口号
- 构造方法:public DatagramPacket(byte buf[], int length, InetAddress address, int port) {}
-
-5- 开始讲课——>send()
MulticastSocket 发送数据方法
-
-6- 下课——> close()
-
-
接收数据:创建要学这一科目的学生——>获取教室信息——>到达教室——>准备接收资源包的位置和大小——>接收数据——>整理笔记——>下课
-
-1- 创建要学这一科目的学生(指定端口号)——.创建MulticastSocket对象
- 构造方法:MulticastSocket ms = new MulticastSocket(发送程序的端口号);
-
-2- 获取教室信息——获取区域地址——创建InetAddress对象
必须加入同一组区域地址中,才能接收到数据- InetAddress address = InetAddress.getByName("组播区域地址");
-
-3- 到达教室——加入这一区域地址中——>joinGroup()
参数:InetAddress类型的IP(区域地址)
-
-4- 准备接收资源包的位置和大小——创建DatagramPacket对象
- 构造方法:public DatagramPacket(byte buf[], int length) {}
参数:字节数组,要用来接收数据的数组长度
- 构造方法:public DatagramPacket(byte buf[], int length) {}
-
-5- 接收数据——receive()
-
-6- 整理笔记——解析数据
- 6.1 获取data数据类型数组——>getData();
- 6.2 获取真实数据长度——>getLength();
- 6.3 获取发送端的电脑IP——>getAddress().getHostAddress();
此时返回的是真实的IP(字符串类型)。getAddress()返回的是InetAddress类型的IP
- 6.4 获取发送端的电脑名字——>getAddress().getHostName();
- 6.5字符数组变成字符串——new String(data,0,len);
参数:字符数组,开始索引,截取的长度
-
-7- 下课——close()
-
-
-
广播——公开演讲,直播——>一个人发消息,所有人都能收到。
广播地址:255.255.255.255-
广播和单播实现过程一致,只是将接收端的电脑IP改为 255.255.255.255就可以
-
-
-
2. TCP通信程序
通信之前保证连接已经建立-
特点:TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,通信之前要保证连接已经建立,通过Socket产生I0流来进行网络通信
细节1:在创建对象的同时会连接服务端 如果连接不上,代码会报错
细节2:IO流是在连接通道里面的。 通道方向从客户端到服务端,所以客户端是输出流,服务端是输入流
-
发送数据:(客户端)——>Socket
-
-1- 创建客户端的Socket对象(Socket)与指定服务端连接——>Socket(String host, int port)
创建对象的同时,通过 三次握手协议和已经在等待的服务端建立连接通道,如果连接不上(没有开启接收端),代码会报错
-
-2- 获取输出流,写数据——> Outputstream getoutputstream()
细节:IO流是在连接通道里面的。 通道方向从客户端到服务端,所以客户端是输出流,服务端是输入流
-
-3- 释放资源——> void close()
- 3.1关闭IO流——断开和服务端(接收端)的连接
细节:由于IO流在通道中,所以流也可以不关闭,只要保证客户端关闭就行
- 3.2关闭客户端(发送端)
关闭时的协议——四次挥手协议:利用这个协议断开连接,而且保证连接通道里面的数据已经处理完毕了
- 3.1关闭IO流——断开和服务端(接收端)的连接
-
-
接收数据:(服务器)——>ServerSocket
-
-1- 创建服务器端的Socket对象(ServerSocket) ——> ServerSocket(int port)
端口号要和指定程序的端口号一致
-
-2- 监听客户端连接,返回一个Socket对象 ——> Socket accept()
程序运行到这,服务端会死等,直到接收到数据
-
-3- 获取输入流,读数据,并把数据显示在控制台 ——> InputStream getInputStream()
为了方便展示,使用链式法则- 将链式分开:
- 3.1 创建字节流对象,使用字节流直接接收数据,传递中文容易乱码
- 3.2 使用转换流,将字节流转换成字符流,此时就可以读取中文
- 3.3 使用缓冲流,用来提高字符流的效率
- 将链式分开:
-
-4- 释放资源 ——> void close()
- 4.1关闭IO流——断开和客户端(发送端)的连接
细节:由于IO流在通道中,所以流也可以不关闭,只要保证服务端关闭就行
- 3.2关闭服务端(接收端)
关闭时的协议——四次挥手协议:利用这个协议断开连接,而且保证连接通道里面的数据已经处理完毕了
- 4.1关闭IO流——断开和客户端(发送端)的连接
-
-
补充知识点:
-
1.客户端(发送) <——> 服务端(接收) 完整逻辑
-
2. TCP通信程序(三次握手)——>确保连接
-
3. TCP 通信程序(四次挥手)——>确保连接断开,且数据处理完毕
-
-