码迷,mamicode.com
首页 > 其他好文 > 详细

UDP聊天

时间:2016-10-04 20:58:09      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class ChatDemo {

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

        /*
         * 通过UDP协议 完成一个聊天程序。 一个负责发送数据的任务,一个负责接收数据的任务 两个任务需要同时执行,可以使用多线程技术
         */
        
        //创建socket服务
        //发送端
        DatagramSocket send = new DatagramSocket(8888);
        DatagramSocket rece = new DatagramSocket(10001);
        
        new Thread(new Send(send)).start();
        new Thread(new Rece(rece)).start();
        

    }

}

// 负责发送的任务,通过UDP的socket发送
class Send implements Runnable {
    // 任务对象一建立,需要socket对象
    private DatagramSocket ds;

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

    @Override
    public void run() {
        // 具体的发送数据的任务内容
        // 1.要发送的数据来自哪里?键盘录入
        BufferedReader bufr = new BufferedReader(new InputStreamReader(
                System.in));

        // 1.1读取数据
        String line = null;
        try {
            while ((line = bufr.readLine()) != null) {

                // 1.2将数据封装成字节数组
                // 2.将数据封装到数据包中。
                byte[] buf = line.getBytes();
                DatagramPacket dp = new DatagramPacket(buf, buf.length,
                        InetAddress.getByName("192.168.17.255"), 10001);//255是广播,在该网路段的所有主机都能收到

                // 3.将数据包发送出去。
                ds.send(dp);

                if ("over".equals(line)) {
                    break;
                }
            }
            ds.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

// 负责接收的任务
class Rece implements Runnable {

    private DatagramSocket ds;

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

    @Override
    public void run() {
        while (true) {
            // 接收的具体的任务内容
            // 1.因为接收的数据最终都会存储到数据包中,而数据包中必须有字节数组。
            byte[] buf = new byte[1024];

            // 2.创建数据包对象
            DatagramPacket dp = new DatagramPacket(buf, buf.length);

            // 3.将数据存储到数据包中
            try {
                ds.receive(dp);
                // 4.获取数据
                String ip = dp.getAddress().getHostAddress();

                String data = new String(dp.getData(), 0, dp.getLength());
                
                System.out.println(ip + ":" + data);
                
                if("over".equals(data)){
                    System.out.println(ip+"......离开聊天室");
                }


            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

}

 

UDP聊天

标签:

原文地址:http://www.cnblogs.com/qjlbky/p/5931223.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!