IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 基于UDP协议的通信程序 -> 正文阅读

[网络协议]基于UDP协议的通信程序

一、什么是UDP,它的缺点是什么?

UDP:用户数据报协议[无连接的协议]
缺点:不能保证数据的安全与可靠。
优点:消耗小,效率高

?二、建立基于UDP的网络通讯程序需要使用的类和常用方法

基于UDP的网络通讯程序是不区分客户端和服务器。
java.net.DatagramPacket---该类表示数据报包。【打包被发送的数据/接收发来的数据】
构造方法:
????DatagramPacket(byte[]?buf, int?length)?
? ? 构造一个 DatagramPacket用于接收长度的数据包length。【接收发来的数据的数据包】
? ? DatagramPacket(byte[]?buf, int?length, InetAddress?address, int?port)?
? ? 构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。
实例方法:
?? ?byte[]?? ?getData() 返回数据缓冲区。?
?? ?int?? ?getLength() 返回要发送的数据的长度或接收到的数据的长度。?
?? ?InetAddress?? ?getAddress() 返回该数据报发送或接收数据报的计算机的IP地址。
?? ?int?? ?getPort() 返回发送数据报的远程主机上的端口号,或从中接收数据报的端口号。?
UDP协议的通信程序创建步骤:
?? ?发送方步骤:
?? ?1.将需要发送的数据通过
?? ? ?DatagramPacket(byte[]?buf, int?length, InetAddress?address, int?port) 构造方法打包好
?? ?2.通过DatagramSocket()的构造方法创建DatagramSocket对象。
?? ?3.DatagramSocket对象的send方法将打包好的数据报包,发送。
?? ?4.关闭DatagramSocket。
????接收方步骤
?? ?1.通过DatagramSocket(int?port)创建接收数据的DatagramSocket对象。
?? ?2.通过DatagramPacket(byte[]?buf, int?length) 创建一个空的数据报包。
?? ?3.通过调用接收数据的DatagramSocket对象的receive方法接收数据报包到空的数据报包。
?? ?4.解析数据报包
?? ?5.关闭DatagramSocket
实例1:客户端向服务器发送数据,服务器接收客户端发送来的数据
发送端

package com.wangxing.test1;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPsend {
	public static void main(String[] args) throws Exception{
		BufferedReader bufferedReader=null;
		int serverPort=3000;
		InetAddress address=null;
		byte data[]=null;
		//将需要发送的数据通过DatagramPacket对象的构造方法 DatagramPacket(byte[]?buf, int?length, InetAddress?address, int?port)
		DatagramPacket sendPackset=null;
		//通过DatagramSocket()的构造方法得到DatagramPacket对象
		DatagramSocket sendSocket=null;
		//从键盘得到发送的数据
		bufferedReader=new BufferedReader(new InputStreamReader(System.in));
		System.out.print("请输入要发送的内容:");
		data=bufferedReader.readLine().getBytes();
		address=address.getLocalHost();
		sendPackset=new DatagramPacket(data,data.length,address,serverPort);
		sendSocket=new DatagramSocket();
		//3.DatagramSocket对象的send方法将打包好的数据报包,发送。
		sendSocket.send(sendPackset);
		//4.关闭DatagramSocket。
		sendSocket.close();
	}
}

接收端:

package com.wangxing.test1;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPreceive {
	public static void main(String[] args) throws Exception{
		DatagramSocket receiveScoket=null;
		DatagramPacket receivepacket=null;
		int receivePort=3000;
		int len=0;
		byte data[]=new byte[1024];
		InetAddress localHost=null;
		int port;
		String info=null;
		//1.通过DatagramSocket(int?port)创建接收数据的DatagramSocket对象。
		receiveScoket=new DatagramSocket(receivePort);
		System.out.println("接受端已经开启-------------------");
		//2.通过DatagramPacket(byte[]?buf, int?length) 创建一个空的数据报包。
		receivepacket=new DatagramPacket(data,data.length);
		//3.通过调用接收数据的DatagramSocket对象的receive方法接收数据报包到空的数据报包。
		receiveScoket.receive(receivepacket);
		//4.解析数据报包
		//得到数据报中解析的数据
		info=new String(receivepacket.getData());
		//得到数据报中解析的数据发送方的主机IP
		localHost=receivepacket.getAddress();
		//得到数据报中解析的数据发送方的发送数据程序的端口
		port=receivepacket.getPort();
		System.out.println("从"+localHost+":"+port+"上接受到的数据:"+info);
		//5.关闭DatagramSocket
		receiveScoket.close();
	}
}

?

实例2:客户端向服务器持续发送数据,服务器持续接收客户端发送来的数据
发送端
package com.wangxing.test2;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPsend {
	public static void main(String[] args) throws Exception{
		BufferedReader bufferedReader=null;
		int serverPort=3000;
		InetAddress address=null;
		//得到数据字符
		String datastr=null;
		byte data[]=null;
		//将需要发送的数据通过DatagramPacket对象的构造方法 DatagramPacket(byte[]?buf, int?length, InetAddress?address, int?port)
		DatagramPacket sendPackset=null;
		//通过DatagramSocket()的构造方法得到DatagramPacket对象
		DatagramSocket sendSocket=null;
		//从键盘得到发送的数据
		bufferedReader=new BufferedReader(new InputStreamReader(System.in));
		address=address.getLocalHost();
		sendSocket=new DatagramSocket();
		//判断持续执行的变量
		boolean flag=true;
		while(flag){
			System.out.print("请输入要发送的内容:");
			datastr=bufferedReader.readLine();
			data=datastr.getBytes();
			sendPackset=new DatagramPacket(data,data.length,address,serverPort);
			//3.DatagramSocket对象的send方法将打包好的数据报包,发送。
			sendSocket.send(sendPackset);
			if(datastr.equals("exit")){
				flag=false;
			}
		}
		//4.关闭DatagramSocket。
		sendSocket.close();
	}
}
接收端
?
package com.wangxing.test2;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPreceive {
	public static void main(String[] args) throws Exception{
		DatagramSocket receiveScoket=null;
		DatagramPacket receivepacket=null;
		int receivePort=3000;
		int len=0;
		byte data[]=new byte[1024];
		InetAddress localHost=null;
		int port;
		String info=null;
		//判断持续执行的变量
		boolean flag=true;
		//1.通过DatagramSocket(int?port)创建接收数据的DatagramSocket对象。
		receiveScoket=new DatagramSocket(receivePort);
		System.out.println("接收端已经开启-------------------");
		//2.通过DatagramPacket(byte[]?buf, int?length) 创建一个空的数据报包。
		receivepacket=new DatagramPacket(data,data.length);
		while(flag){
			//3.通过调用接收数据的DatagramSocket对象的receive方法接收数据报包到空的数据报包。
			receiveScoket.receive(receivepacket);
			//4.解析数据报包
			//得到数据报中解析的数据
			info=new String(receivepacket.getData(),0,receivepacket.getLength());
			//得到数据报中解析的数据发送方的主机IP
			localHost=receivepacket.getAddress();
			//得到数据报中解析的数据发送方的发送数据程序的端口
			port=receivepacket.getPort();
			System.out.println("从"+localHost+":"+port+"上接受到的数据:"+info);
			if(info.equals("exit")){
				flag=false;
			}
		}
		
		//5.关闭DatagramSocket
		receiveScoket.close();
	}
}

?

实例3:创建发送端和客户端双向传输数据
?
package com.wangxing.test3;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPsend {
	public static void main(String[] args) throws Exception{
		BufferedReader bufferedReader=null;
		int serverPort=3000;
		InetAddress address=null;
		//得到数据字符
		String datastr=null;
		byte data[]=null;
		//将需要发送的数据通过DatagramPacket对象的构造方法 DatagramPacket(byte[]?buf, int?length, InetAddress?address, int?port)
		DatagramPacket sendPackset=null;
		DatagramPacket sendPackset2=null;
		//通过DatagramSocket()的构造方法得到DatagramPacket对象
		DatagramSocket sendSocket=null;
		//通过DatagramSocket(int?port)创建接收数据的DatagramSocket对象。
		DatagramSocket sendSocket2=null;
		//创建接收发送方返回的端口号
		int receiveport=3001;
		//通过DatagramPacket(byte[]?buf, int?length) 创建一个空的数据报包。
		DatagramPacket senPack=null;
		//创建即将保存得到发送反返回数据的数组
		byte receiveData[]=new byte[1024];
		//创建返回数据字节数组
		byte reData[]=new byte[1024];
		//创建保存返回字节数组数据的字符串
		String receiveInfo=null;
		//从键盘得到发送的数据
		bufferedReader=new BufferedReader(new InputStreamReader(System.in));
		address=InetAddress.getLocalHost();
		sendSocket=new DatagramSocket();
		//接收返回的数据
		sendSocket2=new DatagramSocket(receiveport);
		//创建接收返回数据的心数据报包
		sendPackset2=new DatagramPacket(receiveData,receiveData.length);
		//判断持续执行的变量
		boolean flag=true;
		while(flag){
			System.out.print("请输入要发送的内容:");
			datastr=bufferedReader.readLine();
			data=datastr.getBytes();
			sendPackset=new DatagramPacket(data,data.length,address,serverPort);
			//3.DatagramSocket对象的send方法将打包好的数据报包,发送。
			sendSocket.send(sendPackset);
			//使用DatagramSocket对象的实例方法receive()接收数据报包
			sendSocket2.receive(sendPackset2);
			receiveData=sendPackset2.getData();
			receiveInfo=new String(receiveData,0,sendPackset2.getLength());
			System.out.println(receiveInfo);
			if(datastr.equals("exit")){
				flag=false;
			}
		}
		//4.关闭DatagramSocket。
		sendSocket.close();
        sendSocket2.close();
	}
}
package com.wangxing.test3;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPreceive {
	public static void main(String[] args) throws Exception{
		DatagramSocket receiveScoket=null;
		DatagramSocket receiveScoket2=null;
		DatagramPacket receivepacket2=null;
		DatagramPacket receivepacket=null;
		int receivePort=3000;
		int len=0;
		byte arr[]=new byte[1024];
		InetAddress localHost=null;
		//定义发送数据段程序的端口
		int port;
		//保存返回给发送端的端口
		int sendPort=3001;
		//创建得到数据的字节数组
		byte data[]=null;
		//创建的得到数据字符串
		String info=null;
		//得到返回数组的IP
		InetAddress receiveAddress=InetAddress.getLocalHost();
		//判断持续执行的变量
		boolean flag=true;
		//1.通过DatagramSocket(int?port)创建接收数据的DatagramSocket对象。
		receiveScoket=new DatagramSocket(receivePort);
		//通过通过DatagramPacket(byte[]?buf, int?length)
		System.out.println("接收端已经开启-------------------");
		//2.通过DatagramPacket(byte[]?buf, int?length, InetAddress?address, int?port)
		receivepacket=new DatagramPacket(arr,arr.length);
		while(flag){
			//3.通过调用接收数据的DatagramSocket对象的receive方法接收数据报包到空的数据报包。
			receiveScoket.receive(receivepacket);
			//4.解析数据报包
			//得到数据报中解析的数据
			info=new String(receivepacket.getData(),0,receivepacket.getLength());
			//得到数据报中解析的数据发送方的主机IP
			localHost=receivepacket.getAddress();
			//得到数据报中解析的数据发送方的发送数据程序的端口
			port=receivepacket.getPort();
			System.out.println("从"+localHost+":"+port+"上接受到的数据:"+info);
			//得到数据后返回给发送方结果
			String xinxi="接收方返回---";
			data=(xinxi+info).getBytes();
			receivepacket2=new DatagramPacket(data,data.length,receiveAddress,sendPort);
			receiveScoket2=new DatagramSocket();
			receiveScoket2.send(receivepacket2);
			if(info.equals("exit")){
				flag=false;
			}
		}
		
		//5.关闭DatagramSocket
		receiveScoket.close();
		receiveScoket2.close();
	}
}

?

实例4:多个发送端给一个接收端
?
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-12-04 13:46:48  更:2021-12-04 13:47:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/6 7:54:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码