廖雪峯Java13網絡編程-1Socket編程-5UDP編程

1. UDP編程:

  • 不須要創建鏈接
  • 能夠直接發送和接收數據

1.1 客戶端

DatagramSocket sock = new DatagramSocket(){}
    sock.connect(addr,9090);//並不創建鏈接
    //接收
    byte[] data=...;
    DatagramPacket packet = new DatagramPacket(data, data.length);
    sock.send(packet);
    //發送
    byte[] buffer = new byte[1024];
    DatagramPacket resp = new DatagramPacket(buffer, buffer.length);
    sock.receive(resp);
    //接收和發送都是經過DatagramPacket實現的

1.2 服務端:

DatagramSocket ds = new DatagramSocket(9090);
    for( ; ; ){
        //接收
        byte[] buffer = new buffer[1024];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        ds.receive(packet);
        //發送
        byte[] data = ...;
        packet.setData(data);
        ds.send(packet);
    }

1.3 實例

TCPClient.javajava

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;

public class UDPClient {
    public static void main(String[] args) throws Exception{
        InetAddress addr = InetAddress.getLoopbackAddress();
        try(DatagramSocket sock = new DatagramSocket()){
            sock.connect(addr,9090);
            byte[] data = "time".getBytes(StandardCharsets.UTF_8);
            DatagramPacket packet = new DatagramPacket(data,data.length);
            sock.send(packet);
            System.out.println("Data was sent");
            Thread.sleep(1000);
            byte[] buffer = new byte[1024];
            DatagramPacket resp = new DatagramPacket(buffer,buffer.length);
            sock.receive(resp);
            byte[] respData = resp.getData();
            String respText = new String(respData,0,resp.getLength());
            System.out.println("Response:"+respText);
        }
    }
}

TCPServer.java編程

package com.crazy;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;

public class UDPServer {
    public LocalDateTime currentTime(){
        return LocalDateTime.now();
    }
    public static void main(String[] args) throws Exception{
        DatagramSocket ds = new DatagramSocket(9090);
        System.out.println("UDP server ready");
        for(;;){
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
            ds.receive(packet);
            byte[] data = packet.getData();
            String s = new String(data, StandardCharsets.UTF_8);
            System.out.println("Pack received from : "+packet.getSocketAddress());
            String resp = LocalDateTime.now().toString();
            packet.setData(resp.getBytes(StandardCharsets.UTF_8));
            ds.send(packet);
        }
    }
}

先運行server

再運行client
服務器

2. 總結:

UDP編程模型:oop

  • 客戶端使用DatagramSocket.connect()指定遠程地址和端口
  • 服務器端用DatagramSocket(port)監聽端口
  • 雙方經過receive/send讀寫數據
  • 沒有IO流接口
相關文章
相關標籤/搜索