UDP通信(原来不通过QQ、微信,还能这样聊天)
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相互通信
客户端:
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); } } }
上一篇:
Java架构师技术进阶路线图
下一篇:
华为交换机开启debug功能