黑马程序员技术交流社区

标题: UDP协议收发数据(模拟聊天) [打印本页]

作者: fashionkillyou    时间: 2017-10-19 22:58
标题: UDP协议收发数据(模拟聊天)
利用UDP进行数据的发送和接收,模拟聊天室。(只是两个端口之间进行的数据交换)需要在两台电脑之间测试
思路:
1、利用UDP协议的知识
2、利用多线程的知识,将接收和发送的代码放入不同的线程里面,实现同时接收和发送

一、程序的入口
[Java] 纯文本查看 复制代码
package datagramsocket;

public class TalkDemo {
        public static void main(String[] args) {
//创建实现了Runnable接口的子类对象发送端
                SendThreadDemo std = new SendThreadDemo();
//创建实现了Runnable接口的子类对象接收端
                ReceiveThreadDemo rtd = new ReceiveThreadDemo();
//创建线程对象
                Thread t1 = new Thread(std);
                Thread t2 = new Thread(rtd);
//开启线程
                t1.start();
                t2.start();
               
        }
}


二、创建接收端的代码:

[Java] 纯文本查看 复制代码



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

public class SendThreadDemo implements Runnable {

        @Override
        public void run() {
                try{
                        while(true){
                                //创建发送端DatagramSocket 对象
                                DatagramSocket ds = new DatagramSocket();
                                //创建数据并打包
                                /*
                                 * DatagramPacket:此类表示数据报包
                                 * 数据byte[]
                                 * 设备的地址 ip
                                 * 进程的地址 端口号
                                 * DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
                                 */
//写一个键盘录入,用来接收输入的消息
                                Scanner sc = new Scanner(System.in);
                                System.out.println(InetAddress.getLocalHost().getHostName()+"-->请输");
                                String s =sc.nextLine();
//创建一个字节数组接收输入的消息
                                byte[] bys = s.getBytes();
                                int len = bys.length;
                                int port = 9997;//设置端口号,这个端口号是接收端暴露出的那个端口号
                                InetAddress address = InetAddress.getByName("192.168.11.60");//设置接收端的IP地址
                                DatagramPacket dp = new DatagramPacket(bys,len,address,port);//包装数据
                                //发送数据
                                ds.send(dp);
                                //释放资源
                                ds.close();
                        }
                }catch(Exception e){
                        e.printStackTrace();
                        
                }
        }

}



三、创建发送端的代码:
[Java] 纯文本查看 复制代码


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

public class ReceiveThreadDemo implements Runnable {

        @Override
        public void run() {
                try{
                        while(true){
                                //创建接收端的DatagramSocket 对象
                                DatagramSocket ds = new DatagramSocket(9998);
                                //接收数据
                                byte[] bys = new byte[1024];
                                DatagramPacket dp = new DatagramPacket(bys, bys.length);
                                
                                ds.receive(dp);//阻塞方法,只有接到数据才会往下执行
                                //解析数据
                                //InetAddress getAddress()
                                InetAddress address = dp.getAddress();
                                byte[] data = dp.getData();//这里也可以使用接收数据的bys数组
                                int length = dp.getLength();
                                //输出数据
                                System.out.println("sender-->" + address.getHostAddress());//获取主机名称并打印显示
                                System.out.println(new String(data,0,length));
                                //释放资源
                                ds.close();
                        }
                }catch(Exception e){
                        e.printStackTrace();
                }
        }

}








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2