java UDP
java中UDP的實現氛圍兩個類:DatagramPacket?和 DatagramSocket
DatagramPacket類將數據填充到UDP包中,這稱為數據報,有你來解包接受的數據報.
DatagramSocket可以收發UDP數據報,為收發送數據要將數據放到DatagramPacket中
兩個參數的構造器用于接收數據報
四個參數的構造器用于發送數據報
一.客服端?
java編程思想UDP client實例
package test; import java.net.*; public class Dgram {public static DatagramPacket toDatagram(String s,InetAddress destIA,int destPort){byte[] buf = new byte[s.length() + 1];buf = s.getBytes();return new DatagramPacket(buf,buf.length,destIA,destPort);}public static String toString(DatagramPacket p){return new String(p.getData(),0,p.getLength());}}//: ChatterClient.java // Tests the ChatterServer by starting multiple // clients, each of which sends datagrams. package test; import java.lang.Thread; import java.net.*; import java.io.*; public class ChatterClient extends Thread { // Can listen & send on the same socket: private DatagramSocket s; private InetAddress hostAddress; private byte[] buf = new byte[1000]; //設置數據包大小,要比發送的數據大private DatagramPacket dp = new DatagramPacket(buf, buf.length); // private int id; public ChatterClient(int identifier) { id = identifier; try { // Auto-assign port number: s = new DatagramSocket(0);//參數不填或是0的話 代表隨機選擇端口發送s.setSoTimeout(10000);//設置超時時間hostAddress = InetAddress.getByName("106.13.46.152"); //獲得連接端口} catch(UnknownHostException e) { System.err.println("Cannot find host"); System.exit(1); } catch(SocketException e) { System.err.println("Can't open socket"); e.printStackTrace(); System.exit(1); } System.out.println("ChatterClient starting"); } public void run() { try { for(int i = 0; i < 10; i++) { String outMessage = "Client #" + id + ", message #" + i; // Make and send a datagram: s.send(Dgram.toDatagram(outMessage, hostAddress, ChatterServer.INPORT)); //得到一個DatagramPacket數據包并發送// Block until it echoes back: s.receive(dp); //接收數據報// Print out the echoed contents: String rcvd = "Client #" + id + ", rcvd from " + dp.getAddress() + ", " + dp.getPort() + ": " + Dgram.toString(dp); // String rcvd = new String(dp.getData(),0,dp.getLength(),"UTF-8"); System.out.println(dp); } } catch(IOException e) { e.printStackTrace(); System.exit(1); } } public static void main(String[] args) { for(int i = 0; i < 10; i++) new ChatterClient(i).start(); } } ///:~java?網絡編程UDP實例
//: ChatterClient.java // Tests the ChatterServer by starting multiple // clients, each of which sends datagrams. package test; import java.lang.Thread; import java.net.*; import java.io.*; public class ChatterClient extends Thread { private final static int PORT = 5000;//要發送的端口private static final String HOSTNAME = "106.13.46.152";//要連連接的地址public static void main(String[] args){try(DatagramSocket socket = new DatagramSocket(0)){//資源自動關閉socket.setSoTimeout(10000);InetAddress host = InetAddress.getByName(HOSTNAME);DatagramPacket request = new DatagramPacket(new byte[1],1,host,PORT);//用于發送的數據報DatagramPacket response = new DatagramPacket(new byte[1024],1024);//用于接收的數據報socket.send(request);//發送socket.receive(response);//接收String result = new String(response.getData(),0,response.getLength(),"UTF-8");System.out.println(result);}catch(IOException e){e.printStackTrace();}} } ///:~
二.服務器
首先打開一個數據報
DatagramSocket socket = new DatagramSocket(1033) //在內Unix系統上小于1024的端口要root權限
接下來,創建一個接受請求的數據包
Datagrampacket request = new DatagramPacket(new byte[1024],0,1024) ;從0存儲到1024
然后接收數據包
socket.receive(request);//這個調用將阻塞,直到接收到數據包
然后再創建一個響應數據包.包括四個部分:要發送的原始數據,待發送的原始數據的字節數,要發送到哪個主機,以及發送到該主機上哪個接口,
java網絡編程示例:
package test;import java.io.IOException; import java.net.*; import java.text.DateFormat; import java.text.Format; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.logging.*; public class DaytimeUDPServer {private final static int PORT = 1200;private final static Logger audit = Logger.getLogger("requests");private final static Logger errors = Logger.getLogger("errors");public static void main(String[] args){try(DatagramSocket socket = new DatagramSocket(PORT)){while(true){try{System.out.println("start");DatagramPacket requst = new DatagramPacket(new byte[1024],0,1024);socket.receive(requst);DateFormat df = new SimpleDateFormat();String daytime = df.format(new Date()).toString();byte[] data = daytime.getBytes("UTF-8");DatagramPacket send = new DatagramPacket(data,data.length,requst.getAddress(),requst.getPort());socket.send(send);audit.info(daytime + " " + requst.getAddress());}catch(IOException|RuntimeException e){errors.log(Level.SEVERE,e.getMessage(), e);//發送錯誤到控制臺}}}catch(IOException e){errors.log(Level.SEVERE,e.getMessage(),e);}} }?java?編程思想示例
package socket; //: ChatterServer.java //A server that echoes datagrams import java.net.*; import java.io.*; import java.util.*; public class ChatterServer { static final int INPORT = 5000; private byte[] buf = new byte[1000]; private DatagramPacket dp = new DatagramPacket(buf, buf.length); // Can listen & send on the same socket: private DatagramSocket socket; public ChatterServer() { try { socket = new DatagramSocket(INPORT); System.out.println("Server started"); while(true) { // Block until a datagram appears: socket.receive(dp); String rcvd = Dgram.toString(dp) + ", from address: " + dp.getAddress() + ", port: " + dp.getPort(); System.out.println(rcvd); String echoString = "Echoed: " + rcvd; // Extract the address and port from the // received datagram to find out where to // send it back: DatagramPacket echo = Dgram.toDatagram(echoString, dp.getAddress(), dp.getPort()); socket.send(echo); } } catch(SocketException e) { System.err.println("Can't open socket"); System.exit(1); } catch(IOException e) { System.err.println("Communication error"); e.printStackTrace(); } } public static void main(String[] args) { new ChatterServer(); } } ///:~?
轉載于:https://www.cnblogs.com/jiangfeilong/p/10506019.html
總結
- 上一篇: ASP.NET Core 实现带认证功能
- 下一篇: GAN_李弘毅讲解