一、UDP socket api的使用
Java? ? ? ? 把系統原生的封裝了.
核心的類有兩個:
1? ?->? ?DatagramSocket
操作系統中,有一類文件,就叫socket文件.
socket文件,抽象表示了 " 網卡"這樣的硬件設備.
進行網絡通信最核心的硬件設備網卡
通過網卡發送數據,就是寫socket文件
通過網卡接收數據,就是讀socket文件
2? ?->? ?DatagramPacket
UDP面向數據報,每次發送接收數據的基本單位,就是一個UDP數據報.
表示了一個UDP數據報
二、回顯服務器
這是網絡編程中,最簡單的程序了,網絡編程的hello world
客戶端發什么請求返回什么請求
1. socket api的使用
2. 典型的客戶端服務器基本工作流程
1.1 服務器代碼
private DatagramSocket socket = null;public UdpEchoServer(int port) throws SocketException {socket = new DatagramSocket(port);}//服務器啟動邏輯public void start() throws IOException {System.out.println("服務器啟動");while(true) {//每次循環,就是一個請求//1.讀取請求并解析DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);socket.receive(requestPacket);//讀到的字節數組,轉成String方便后續的邏輯處理String request = new String(requestPacket.getData(),0,requestPacket.getLength());//2.根據請求計算響應String response = process(request);//3.把響應返回到客戶端//構造一個DatagramPacket 作為響應對象DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);//打印日志System.out.printf("[%s:%d] req: %s,resp: %s\n",requestPacket.getAddress().toString(),requestPacket.getPort(),request,response);}}private String process(String request) {return request;}public static void main(String[] args) throws IOException {UdpEchoServer server = new UdpEchoServer(9090);server.start();}
1.2 客戶端代碼
private DatagramSocket socket = null;private String serverIP;private int serverPort;public UdpEchoClient(String serverIP,int serverPort) throws SocketException {this.serverIP=serverIP;this.serverPort=serverPort;socket = new DatagramSocket();}public void start() throws IOException {System.out.println("客戶端啟動");Scanner scanner = new Scanner(System.in);while(true){System.out.print("->");if(!scanner.hasNext()){//沒有輸入就break;break;}String request = scanner.next();DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(serverIP),serverPort);socket.send(requestPacket);DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);String response = new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println(response);}}public static void main(String[] args) throws IOException {UdpEchoClient client = new UdpEchoClient("127.0.0.1",9090);client.start();}