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();
            }

        }
    }

}

 

posted on 2016-10-04 20:23  北方丶有佳人  阅读(165)  评论(0编辑  收藏  举报