建設網站建站公司軟件外包公司有前途嗎
這一篇文章我們將講述網絡編程中UDP服務器客戶端的編程代碼
1、前置知識
UDP協議全稱是用戶數據報協議,在網絡中它與TCP協議一樣用于處理數據包,是一種無連接的協議。
UDP的特點有:無連接、盡最大努力交付、面向報文、沒有擁塞控制
本文講的回響服務器是指客戶端向服務器發(fā)送一個報文,從服務器那里得到一條一模一樣的回響報文
該代碼需要在同一個包下創(chuàng)建兩個類,服務器UdpEchoServer類,客戶端UdpEchoClient類
2、服務器端代碼
(1)完整代碼
先放上完整代碼
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;public class UdpEchoServer {public static DatagramSocket socket = null;public UdpEchoServer(int port) throws SocketException {//手動指定服務器端口號socket = new DatagramSocket(port);}public static void start() throws IOException {while (true){System.out.println("服務器啟動");DatagramPacket requestPacket = new DatagramPacket(new byte[1024],1024);socket.receive(requestPacket);String request = new String(requestPacket.getData(),0,requestPacket.getLength());String response = process(request);DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);System.out.printf("[%s:%d] req:%s,resp:%s",requestPacket.getAddress(),requestPacket.getPort(),request,response);System.out.println();}}public static String process(String request){return request;}public static void main(String[] args) throws IOException {UdpServer server = new UdpServer(9090);server.start();}}
(2)代碼講解
構造方法中手動指定服務器端口號
public UdpEchoServer(int port) throws SocketException {//手動指定服務器端口號socket = new DatagramSocket(port);
}
start()方法中進行信息的接收、處理、發(fā)送?
public static void start() throws IOException {while (true){System.out.println("服務器啟動");//創(chuàng)建接收報文,用socket進行接收請求報文DatagramPacket requestPacket = new DatagramPacket(new byte[1024],1024);socket.receive(requestPacket);//將請求報文轉化為請求字符串,用process()方法進行處理,得到響應字符串String request = new String(requestPacket.getData(),0,requestPacket.getLength());String response = process(request);//將得到的響應字符串轉化為響應報文,并用socket進行發(fā)送DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);//打印客戶端IP地址和端口號信息System.out.printf("[%s:%d] req:%s,resp:%s",requestPacket.getAddress(),requestPacket.getPort(),request,response);System.out.println();}
}
process()方法
直接返回接收到的字符串
public static String process(String request){return request;
}
3、 客戶端代碼
?(1)完整代碼
import java.io.IOException;
import java.net.*;
import java.util.Scanner;public class UdpEchoClient {public static DatagramSocket socket = null;private static String ip = null;private static int port = 0;public UdpEchoClient(String ip,int port) throws SocketException {//系統(tǒng)自動為客戶端分配端口socket = new DatagramSocket();this.ip = ip;this.port = port;}public static void start() throws IOException {System.out.println("客戶端啟動!");Scanner scanner = new Scanner(System.in);while (true){System.out.print("->");String request = scanner.next();DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(ip),port);socket.send(requestPacket);DatagramPacket responsePacket = new DatagramPacket(new byte[1024],1024);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();}
}
(2)代碼講解
客戶端由于可能有多個,所以需要系統(tǒng)自動為客戶端分配端口
當初始化socket時,客戶端還需要記下服務器端的ip和端口?
public static DatagramSocket socket = null;
private static String ip = null;
private static int port = 0;public UdpEchoClient(String ip,int port) throws SocketException {//系統(tǒng)自動為客戶端分配端口socket = new DatagramSocket();//記錄ip和端口號this.ip = ip;this.port = port;
}
start()方法?
public static void start() throws IOException {System.out.println("客戶端啟動!");Scanner scanner = new Scanner(System.in);while (true){System.out.print("->");String request = scanner.next();//將讀取到的字符串轉化為請求報文,并用socket進行發(fā)送DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(ip),port);socket.send(requestPacket);//創(chuàng)建回應報文來接收響應DatagramPacket responsePacket = new DatagramPacket(new byte[1024],1024);socket.receive(responsePacket);//將響應報文轉換成字符串,并打印出來String response = new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println(response);}
}