[Java網絡編程] UDP協議實現簡單一對一聊天

UDP_Send 類用來發送消息

package NET;

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

public class UDP_Send implements Runnable {
    private String toIP;
    private int toPort;
    private DatagramSocket sender;
    private BufferedReader reader;

    public UDP_Send(int fromPort, String toIP, int toPort) throws SocketException {
        this.toIP = toIP;
        this.toPort = toPort;
        this.sender = new DatagramSocket(fromPort);
        this.reader = new BufferedReader(new InputStreamReader(System.in));
    }

    @Override
    public void run() {
        while (true) {
            String msg;
            try {
                msg = reader.readLine();
                byte[] data = msg.getBytes();
                DatagramPacket packet = new DatagramPacket(data, data.length,
                        new InetSocketAddress(toIP, toPort));
                sender.send(packet);

                if (msg.equals("bye")) {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        sender.close();
    }
}

UDP_Receive 類用來接收消息

package NET;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.Arrays;

public class UDP_Receive implements Runnable {
    private DatagramSocket recipient;

    UDP_Receive(int fromPort) throws SocketException {
        recipient = new DatagramSocket(fromPort);
    }

    @Override
    public void run() {
        while (true) {
            byte[] container = new byte[1<<16];
            DatagramPacket packet = new DatagramPacket(container, container.length);
            try {
                recipient.receive(packet);
                byte[] data = packet.getData();
                String msg = new String(data, 0, data.length);
                System.out.println("對方:" + msg);
                if (msg.equals("bye")) {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        recipient.close();
    }
}

由本機發送並由本機接收,模擬兩人一對一聊天。其中,用戶一(UDP_Request)通過端口 11111 發送消息給用戶二(UDP_Response)監聽的端口 22222,用戶二通過端口 33333 發送消息給用戶一監聽的端口 44444。將消息顯示在控制檯上,以實現簡單通信。

package NET;

import java.net.SocketException;

public class UDP_Request {
    public static void main(String[] args) throws SocketException {
        new Thread(new UDP_Send(11111, "localhost", 22222)).start();
        new Thread(new UDP_Receive(44444)).start();
    }
}
package NET;

import java.net.SocketException;

public class UDP_Response {
    public static void main(String[] args) throws SocketException {
        new Thread(new UDP_Receive(22222)).start();
        new Thread(new UDP_Send(33333, "localhost", 44444)).start();
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章