1. 程式人生 > >Socket —— 通過多執行緒簡單模擬了聊天室

Socket —— 通過多執行緒簡單模擬了聊天室

/**
 * Created by Liwei on 2016/7/17.
 * 模擬一個簡單的聊天室程式
 * 通過多執行緒改進剛開的聊天程式,這樣我們就可以實現在一個視窗傳送和接收資料了
 */
public class MainChatRoom {
    public static void main(String[] args) throws SocketException {
        // 作為傳送端的 Socket
        DatagramSocket dsSend = new DatagramSocket();
        // 作為接收端的 Socket ,要指定埠
        DatagramSocket dsReceive = new
DatagramSocket(10086); SendThread sendThread = new SendThread(dsSend); ReceiveThread receiveThread = new ReceiveThread(dsReceive); Thread t1 = new Thread(sendThread); Thread t2 = new Thread(receiveThread); t1.start(); t2.start(); } }

傳送端執行緒:

public
class SendThread implements Runnable { private DatagramSocket datagramSocket; /** * 通過構造方法接收外部傳遞進來的 Socket 物件 * @param datagramSocket */ public SendThread(DatagramSocket datagramSocket){ this.datagramSocket = datagramSocket; } @Override public void run
() { try { // 封裝鍵盤錄入資料 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; while ((line = br.readLine())!=null){ if("886".equals(line)){ break; } byte[] bys = line.getBytes(); DatagramPacket dp = new DatagramPacket(bys,bys.length, InetAddress.getByName("192.168.100.112"),10086); // 傳送資料 datagramSocket.send(dp); } // 釋放資源 datagramSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }

接收端執行緒:

public class ReceiveThread implements Runnable {

    private DatagramSocket datagramSocket;

    public ReceiveThread(DatagramSocket datagramSocket) {
        this.datagramSocket = datagramSocket;
    }

    @Override
    public void run() {
        try {
            byte[] bys = new byte[1024];
            while (true) {
                DatagramPacket dp = new DatagramPacket(bys, bys.length);
                // 接收資料
                datagramSocket.receive(dp);

                // 解析資料

                String ip = dp.getAddress().getHostAddress();
                String data = new String(dp.getData(),0,dp.getLength());
                System.out.println("從 ip "+ ip + " 接收到資料:" + data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 接收端,不要關閉 Socket

    }
}