1. 程式人生 > >Java Socket編程之UDP

Java Socket編程之UDP

oid 大小 throw tar int while thread print client

UDP編程:

將要傳輸的數據定義成數據包(Datagram),在數據報中指明所要到達的Socket(主機地址和端口號),然後再將數據報發送出去。

相關操作類: DatagramPacket 數據報包

DatagramSocket 進行端到端通信的類

服務器端實現步驟:

  1. 創建DatagramSocket,指定端口號
  2. 創建DatagramPacket
  3. 接收客戶端發送的數據信息
  4. 讀取數據

客戶端實現步驟:

  1. 定義發送信息
  2. 創建DatagramPacket,包含將要發送的信息
  3. 創建DatagramSocket
  4. 發送信息

服務器端:

public class UDPServer {
    public static void main(String[] args) throws IOException {
        /*
         * 接收客戶端發送的數據
         */
        //1.創建服務器端DatagramSocket,指定端口
        DatagramSocket socket=new DatagramSocket(8888);
        System.out.println("服務器端已經啟動,等待客戶端發送數據");
        while(true){
            
//2.創建數據報,用於接收客戶端發送的數據 byte[] data=new byte[1024];//創建字節數組指定接收的數據包大小 DatagramPacket packet=new DatagramPacket(data, data.length); //3.接收客戶端發送的數據 socket.receive(packet);//此方法在接收到數據報之前一直處於阻塞狀態 UDPThread udpthread=new UDPThread(packet,socket); udpthread.start(); } } }

Tips:在UDPServer類中每次都要重新創建一個Packet

客戶端:

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

/*
 * 客戶端
 */
public class UDPClient {
    public static void main(String[] args) throws IOException {
        /*
         * 向服務器端發送數據
         */
        //1.定義服務器的地址、端口號、數據
        InetAddress address=InetAddress.getByName("localhost");
        int port=8800;
        byte[] data="用戶名:admin;密碼:123".getBytes();
        //2.創建數據報,包含發送的數據信息
        DatagramPacket packet=new DatagramPacket(data, data.length, address, port);
        //3.創建DatagramSocket對象
        DatagramSocket socket=new DatagramSocket();
        //4.向服務器端發送數據報
        socket.send(packet);
       /*
         * 接收服務器端響應的數據
         */
        //1.創建數據報,用於接收服務器端響應的數據
        byte[] data2=new byte[1024];
        DatagramPacket packet2=new DatagramPacket(data2, data2.length);
        //2.接收服務器響應的數據
        socket.receive(packet2);
        //3.讀取數據
        String reply=new String(data2, 0, packet2.getLength());
        System.out.println("我是客戶端,服務器說:"+reply);
        //4.關閉資源
        socket.close();
    }
}

UDP多線程類:

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

public class UDPThread extends Thread {
    DatagramPacket packet=null; 
    DatagramSocket socket=null;
    public UDPThread(DatagramPacket packet,DatagramSocket socket){
        this.packet=packet;
        this.socket=socket;
    }
    public  void run() {
            try {
                //4.讀取數據
                String info=new String(packet.getData(), 0, packet.getLength());
                System.out.println("我是服務器,客戶端說:"+info);
                /*
                 * 向客戶端響應數據
                 */
                //1.定義客戶端的地址、端口號、數據
                InetAddress address=packet.getAddress();
                int port=packet.getPort();
                byte[] bytes="歡迎您".getBytes();
                //2.創建數據報,包含響應的數據信息
                DatagramPacket packet2=new DatagramPacket(bytes, bytes.length, address, port);
                //3.響應客戶端
                socket.send(packet2);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //socket.close();不能關閉 
    }
}

Java Socket編程之UDP