1. 程式人生 > >JAVA中基於UDP實現多執行緒通訊

JAVA中基於UDP實現多執行緒通訊

伺服器端程式,利用DatagramSocket負責監聽埠,當客戶端發過來訊息時,伺服器端就會響應,並將訊息內容儲存到Datagrampacket物件中,並且!每一次while迴圈必須重新建立DatagramPacket物件用於儲存訊息資料。並將socket,packet物件傳送給子執行緒,由子執行緒完成後面的事務,主執行緒將進行下一次迴圈,在receive(packet)處阻塞監聽客戶端的響應。

package UDPSocketTell;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPServerThreadText {

public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub
    DatagramSocket socket = new DatagramSocket(8899);
    byte[] infoBytes = new byte[1024];
    int num = 0;
    System.out.println("伺服器端啟動了·········");
    while (true) {
        DatagramPacket packet = new DatagramPacket(infoBytes, infoBytes.length);
        socket.receive(packet);
        UdpServerThread thread = new UdpServerThread(packet, socket, infoBytes);
        thread.start();
        System.out.println(thread);
        System.out.println("訪問的客戶端數量:" + (num++));
    }
}

}
在子執行緒中,由傳過來的socket和packet物件獲取到客戶端傳過來的訊息資料、埠號和InetAddress地址,將訊息資料進行輸出,並對客戶端進行響應。


package UDPSocketTell;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpServerThread extends Thread {
private String info = null;
private DatagramSocket socket = null;
private int port = 0;
private InetAddress address = null;

public UdpServerThread(DatagramPacket packet2, DatagramSocket socket2, byte[] infoBytes2) {
    // TODO Auto-generated constructor stub
    socket = socket2;
    info = new String(infoBytes2, 0, packet2.getLength());
    port = packet2.getPort();
    address = packet2.getAddress();
}

@Override
public void run() {
    // TODO Auto-generated method stub
    super.run();
    System.out.println("客戶端說:" + info);
    byte[] infoBytes = "你好!我是伺服器~".getBytes();
    DatagramPacket packet = new DatagramPacket(infoBytes, infoBytes.length, address, port);
    try {
        socket.send(packet);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

客戶端程式碼,只需要用DatagramPacket packet = new DatagramPacket(infoBytes, infoBytes.length, address, 8899);儲存要傳送的資料,指出要傳送的目標伺服器的地址InetAddress,並用socket.send(packet);發出訊息即可。新建一個packet物件,使用socket.receive(packet2);接收伺服器的響應。

package UDPSocketTell;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
* 客戶端,基於UDP實現Socket通訊
*
* @author 傑仔
*
*/
public class UDPclient {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    byte[] infoBytes = "使用者名稱2:吳俊傑;密碼2:123456".getBytes();// 建立傳送資料的位元組陣列
    InetAddress address;
    try {
        /*
         * 傳送資料包
         */
        address = InetAddress.getByName("127.0.0.1");
        DatagramPacket packet = new DatagramPacket(infoBytes, infoBytes.length, address, 8899);
        DatagramSocket socket = new DatagramSocket();
        System.out.println("客戶端準備傳送資料了!");
        socket.send(packet);
        /*
         * 接收資料包響應
         */
        byte[] Bytes = new byte[1024];
        DatagramPacket packet2 = new DatagramPacket(Bytes, Bytes.length);
        System.out.println("**********客戶端已經啟動************");
        socket.receive(packet2);
        String info = new String(Bytes, 0, packet2.getLength());
        System.out.println("自己的packeg的埠號:" + packet.getPort());
        System.out.println("客戶端發來訊息長度為 " + packet2.getLength() + " 的訊息:" + info + "  訊息埠號為:" + packet2.getPort());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

歡迎入門學習交流,系統收費0.1,勿在意:
歡迎入門學習交流,系統收費0.1,勿在意