UDP协议的特点:
UDP是一种无连接、不可靠传输的协议。
将数据源IP、目的地IP和端口以及数据封装成数据包,大小限制在64KB内,直接发送出去即可。
实现一发一收
注意:先要启动服务端,再启动客户端。不然会造成数据丢失!
客户端:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDP_发送端 {
public static void main(String[] args) throws Exception {
//先要启动服务端,再启动客户端,不然会造成数据丢失
System.out.println("-----客户端启动-----");
//创建发送端对象,发送端自带默认的端口号
//DatagramSocket socket=new DatagramSocket();//采用默认端口号
DatagramSocket socket=new DatagramSocket(8786);//采用自己设定的端口号,但如果端口号已经被使用,则需要自己换一个端口号
//创建一个数据包对象封装数据
/*
public DatagramPacket(byte buf[], int offset, int length,
InetAddress address, int port)
参数一:封装要发送的数据
参数二:发送数据的大小
参数三:服务端的主机IP地址
参数四:服务端的端口
*/
byte [] buffer="这是发送端".getBytes();
DatagramPacket packet=new DatagramPacket(buffer,buffer.length, InetAddress.getLocalHost(),6666);
//发送数据出去
socket.send(packet);
//如果发送完毕,记得关闭
socket.close();
}
}
服务端:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
class UDP_接收端{
public static void main(String[] args) throws Exception {
//先要启动服务端,再启动客户端,不然会造成数据丢失
System.out.println("-----服务端启动-----");
//创建接收端对象,注册端口
DatagramSocket socket=new DatagramSocket(6666);
//创建一个数据包对象接收数据
byte []buffer=new byte[1024*64];
DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
//等待接收数据
socket.receive(packet);
//取出数据
//读取多少倒出多少
int len=packet.getLength();
String str=new String(buffer,0,len);
System.out.println("接收到:"+str);
System.out.println(packet.getPort());//对方端口号
//关闭,释放资源
socket.close();
}
}
实现多发多收:
只要你和对方在同一个局域网,并且知道对方的端口号,你们便可以通过UDP相互通信
注意:这里的通信是指不通过QQ这些软件,从编译器上通过代码运行后来实现通信。
客户端:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class UDP_多发多收 {
public static void main(String[] args) throws Exception {
//先要启动服务端,再启动客户端,不然会造成数据丢失
System.out.println("-----客户端启动-----");
DatagramSocket socket=new DatagramSocket(8786);//采用自己设定的端口号,但如果端口号已经被使用,则需要自己换一个端口号
Scanner sc=new Scanner(System.in);
while (true) {
System.out.println("请输入你要发送的消息:");
String str=sc.nextLine();
if("exit".equals(str)){
System.out.println("离线成功!");
socket.close();//释放资源
break;
}
byte [] buffer=str.getBytes();
DatagramPacket packet=new DatagramPacket(buffer,buffer.length, InetAddress.getLocalHost(),6666);
//发送数据出去
socket.send(packet);
}
}
}
服务端:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
class UDP_接收端2{
public static void main(String[] args) throws Exception {
//先要启动服务端,再启动客户端,不然会造成数据丢失
System.out.println("-----服务端启动-----");
//创建接收端对象,注册端口
DatagramSocket socket=new DatagramSocket(6666);
//创建一个数据包对象接收数据
byte []buffer=new byte[1024*64];
DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
while (true) {
//等待接收数据
socket.receive(packet);
//取出数据
//读取多少倒出多少
int len=packet.getLength();
String str=new String(buffer,0,len);
System.out.println("接收到了来自:"+packet.getAddress()+"对方的端口号是:"+packet.getPort()+"的消息:"+str);
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)