UDP簡單案例_雙人聊天

UDP傳輸協議:
\quad一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。
特點:
· 非面向連接,傳輸不可靠,可能丟失
· 發送不管對方是否準備好,接收方收到也不確認
· 可以廣播發送
· 非常簡單的協議,開銷小

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 TalkSend implements Runnable {
    private DatagramSocket client;  //套接字
    private BufferedReader reader;  //字符緩衝流
    private String toIP;            //接收端的域名
    private int toPort;             //接收端的端口

    public TalkSend(int port, String toIP, int toPort) {
        this.toIP = toIP;
        this.toPort = toPort;
        try {
            client = new DatagramSocket(port);
            reader = new BufferedReader(new InputStreamReader(System.in));
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while(true) {
            String data;
            try {
                data = reader.readLine();
                byte[] datas = data.getBytes();
                //封裝成DatagramPacket包裹,需要指定目的地
                DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(toIP, toPort));
                //發送包裹send(DatagramPacket p)
                client.send(packet);
                if(data.equals("bye"))
                    break;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        client.close();
    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * 接收端:使用面向對象封裝
 */
public class TalkReceive implements Runnable {
    DatagramSocket server; //套接字
    private String from;
    public TalkReceive(int port, String from) {
        this.from = from;
        try {
            this.server = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while(true) {
            byte[] container = new byte[1024 * 60]; //發過來的東西不能太大
            DatagramPacket packet = new DatagramPacket(container, 0, container.length);
            //阻塞式接收包裹receive(DatagramPacket p)
            try {
                server.receive(packet);
                //分析數據
                byte[] datas = packet.getData();
                String msg = new String(datas, 0, packet.getLength());
                System.out.println(from + ":" + msg);
                if(msg.equals("bye"))
                    break;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //釋放資源
        server.close();
    }
}
/**
 * 加入多線程,實現雙向交流 模擬在線諮詢
 */
public class TalkStudent {
    public static void main(String[] args) {
        new Thread(new TalkSend(7777, "localhost", 9999)).start(); //發送
        new Thread(new TalkReceive(8888, "老師")).start(); //接收
    }
}
public class TalkTeacher {
    public static void main(String[] args) {
        new Thread(new TalkReceive(9999, "學生")).start(); //接收
        new Thread(new TalkSend(5555, "localhost", 8888)).start(); //發送
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章