案例——UDP聊天

UDP聊天案例

  做一个网络编程相关的案例,想着用利用UDP的快速且不用连接的优点做一个聊天室,我们一个聊天程序需要可以接收消息,也要可以发送消息,所以我们的DatagramSocket对象不但需要调用send函数,还需要调用recieve函数。
  而且由于聊天的特殊性,有可能在你发送的时候有消息需要接收,所以我们需要用到线程,开启两个线程,一个负责接收,一个负责发送,为了清晰起见,我们将收发消息各封装在两个实现了runnable接口的类中,然后重写run方法,内容就是消息的收或者发。
  在实现操作的时候,开启两个这样的程序,即可与自己聊天了(沙雕嗷~~),当然如果将IP最后一段改成广播形式,那这个局域网内的人都可以收到,即群聊。

接收消息的类

//接收任务
class Receive implements Runnable{

    private DatagramSocket ds;		//私有成员是一个对象,由他调用recieve函数

    public Receive(DatagramSocket ds) {	//构造器
        super();
        this.ds = ds;
    }


    @Override
    public void run() {

        System.out.println("udp  接收端     run");

        while(true)
        {
            try {
                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 text = new String(dp.getData(),0,dp.getLength());

                System.out.println(ip+":"+port+":    "+text);
                if(text.equals("886"))
                {
                    System.out.println(ip+"...离开聊天室");
                }
            } catch (Exception e) {

            }

        }
    }
}

发送消息的类

//发送任务
class Send implements Runnable{

    private DatagramSocket ds;

    public Send(DatagramSocket ds) {
        super();
        this.ds = ds;
    }

    @Override
    public void run() {

        System.out.println("udp  发送端     run");

        try {
            //将数据封装到数据包中。数据包对象是DatagramPacket。数据来自于键盘录入
            BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
            String line = null;

            while ((line = bufr.readLine()) != null)
            {
                byte[] buf = line.getBytes(); //将数据转成字节数组
                //将字节数组封装到数据包中
                //如果IP改为121.255.255.255,最后一位是255,通知所有的主机
                DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("121.255.255.21"), 10003);
                ds.send(dp);

                if("886".equals(line))
                    break;
            }

            ds.close();
        }catch(IOException e) {

        }
    }

}

主类

public class UdpChatTest {
    /**
     * 案例一:通过udp实现群聊程序
     *
     *  思路:
     *  	这个程序既有收又有发,需要同时执行,需要多线程技术
     *  	一个线程复制发,一个线程负责收。需要两个任务
     * @throws IOException
     */

    public static void main(String[] args) throws IOException {

        //发送端的socket 接收端的socket
        DatagramSocket sendDs = new DatagramSocket();
        DatagramSocket ReceDs = new DatagramSocket(10006);

		//创建两个任务对象
        Send send = new Send(sendDs);
        Receive rece = new Receive(ReceDs);
		
		//创建线程对象,并把任务对象传入
        Thread t1 = new Thread(send);
        Thread t2 = new Thread(rece);
		
		//开启线程
        t1.start();
        t2.start();
    }
}
posted @ 2019-10-19 15:17  头发是我最后的倔强  阅读(352)  评论(0编辑  收藏  举报