JAVA学习第六十课 — UDP协议 &基于多线程模拟简单的QQ聊天程序
UDP传输
UDP有发送端和接受端,有两大类,DatagramSocket、DatagramPacket
建立发送端和接收端
建立数据包
调用Socket的接收发送方法
关闭Socket
注意:发送端和接收端是两个独立的运行程序
UDP发送端演示
DatagramPacket(byte[] buf, int length,
InetAddress address, int port)
构造数据报包,用来将长度为 length
的包发送到指定主机上的指定端口号。
public static void UDPsendDemo() throws IOException { System.out.println("发送端"); /* * 创建UDP传输的发送端: * 1.建立UDP的Socket服务 * 2.将要发送的数据封装到数据包中 * 3.用UDP的Socket服务将数据包发送出去 * 4.关闭Socket服务 */ //建立UDP的Socket服务,使用DatagramSocket对象 DatagramSocket ds = new DatagramSocket(); //不指定端口号,发送端,就是随机的 //数据封装成包 String str = "udp发送"; //使用DatagramPacket将数据封装到该对象的包中 byte[] by = str.getBytes(); DatagramPacket dp = new DatagramPacket(by,by.length,InetAddress.getByName("127.0.0.1"),6534); //通过UDP的Socket服务将数据包发送出去,send方法 ds.send(dp); ds.close(); }
UDP接收端演示
public static void UDPreceiveDemo() throws IOException { //接受端 System.out.println("接收端"); /* * 创建UDP传输的接收端: * 1.建立UDP的Socket服务,因为要接收数据,必须要明确端口号 * 2.创建数据包,用于存储接收到的数据,以便于用数据包的方法解析这些数据 * 3.使用Socket服务的receive方法接收的数据存储到数据包中 * 4.通过数据包中的方法解析包中数据 * 5.关闭 */ //建立UDP的Socket服务,使用DatagramSocket对象 DatagramSocket ds = new DatagramSocket(6534);//接收端口6534 //创建数据包 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); //使用接收方法将数据存储到数据包 ds.receive(dp);//注意该方法是阻塞式的 //使用数据包对象的方法,解析其中的数据,如:地址、端口、内容 String ip = dp.getAddress().getHostAddress();//获取ip地址字符串 int port = dp.getPort();//获取端口 String datatext = new String(dp.getData(),0,dp.getLength());//将数据封装成字符串对象 System.out.println("ip:"+ip+"port : "+port+"data:"+datatext); //关闭 ds.close(); }
基于多线程模拟简单的QQ聊天程序
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; class Receive implements Runnable{ private DatagramSocket ds; public Receive(DatagramSocket ds){ this.ds = ds; } public void run() { try { while(true){ byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); ds.receive(dp); String ip = dp.getAddress().getHostAddress(); int port = dp.getPort(); String datatext = new String(dp.getData(),0,dp.getLength()); if(datatext.equals("over")){ System.out.println("ip:"+ip+"port : "+port+"退出聊天室"); } else{ System.out.println("ip:"+ip+"port : "+port+"data:"+datatext); } } } catch (Exception e) { // TODO: handle exception } } } class Send implements Runnable{ private DatagramSocket ds; public Send(DatagramSocket ds){ this.ds = ds; } public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; while((line = br.readLine())!=null){ byte[] buf = line.getBytes(); DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.255"),6534); //IP的有效位是0-254,255是广播,也就是127.0.0,这一IP字段上所有存活的电脑都可以接收到我发的信息 ds.send(dp); if("over".equals(line))break; } ds.close(); } catch (Exception e) { // TODO: handle exception } } } public class Main { public static void main(String[] args) throws IOException{ DatagramSocket dsend =new DatagramSocket(); DatagramSocket dr =new DatagramSocket(6534); Send send = new Send(dsend); Receive receive = new Receive(dr); Thread t1 = new Thread(send); Thread t2 = new Thread(receive); t1.start(); t2.start(); } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。