您好,登錄后才能下訂單哦!
UDP通訊的實現
1.DatagramSocket:用于發送或接收數據包
當服務器要向客戶端發送數據時,需要在服務器端產生一個DatagramSocket對象,在客戶端產生一個DatagramSocket對象。服務器端的DatagramSocket將DatagramPacket發送到網絡上,然后被客戶端的DatagramSocket接收。
DatagramSocket有兩種構造函數。一種是無需任何參數的,常用于客戶端。另一種需要指定端口,常用于服務器。
常用方法:send、receive、 close
2.DatagramPacket:數據容器(封包)的作用
常用方法:構造函數、getAddrress(獲取發送或接收方計算機的IP地址)、getData(獲取發送或接收的數據)、setData(設置發送的數據)
3.UDP通信編程基本步驟:
a)創建客戶端的DatagramSocket,創建時,定義客戶端的監聽端口
b)創建服務器端的DatagramSocket,創建時,定義服務器端的監聽端口
c)在服務器端定義DatagramPacket對象,封裝待發送的數據包。
d)服務器端將數據包發送出去
e)客戶端接收數據包
【示例1】客戶端與服務器端單向通信之客戶端
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress;
public class Client { public static void main(String[] args) throws Exception { byte[] b = "aaaa".getBytes(); //必須告訴數據包要發到哪里去 DatagramPacket dp = new DatagramPacket(b,b.length,new InetSocketAddress("localhost",8999)); //我本身占用9000端口向外面機器發數據包 DatagramSocket ds = new DatagramSocket(9000); ds.send(dp); ds.close(); } } |
【示例2】客戶端與服務器端單向通信之服務器端
import java.net.DatagramPacket; import java.net.DatagramSocket;
public class Server { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(8999); byte[] b = new byte[1024]; DatagramPacket dp = new DatagramPacket(b,b.length);
ds.receive(dp); //阻塞式方法 String string = new String(dp.getData(),0,dp.getLength()); //dp.getLength()返回實際收到的數據的字節數 System.out.println(string); ds.close(); } } |
通過ByteArrayInputStream、ByteArrayOutputStream可以傳遞基本類型數據。
【示例3】客戶端
public class Client { public static void main(String[] args) throws Exception { long n = 2000L; ByteArrayOutputStream bos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(bos); dos.writeLong(n); byte[] b = bos.toByteArray();
//必須告訴數據包要發到哪里去 DatagramPacket dp = new DatagramPacket(b,b.length,new InetSocketAddress("localhost",8999)); //我本身占用9000端口向外面機器發數據包 DatagramSocket ds = new DatagramSocket(9000); ds.send(dp); ds.close(); } } |
【示例4】服務器端
public class Server { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(8999); byte[] b = new byte[1024]; DatagramPacket dp = new DatagramPacket(b,b.length);
ds.receive(dp); //阻塞式方法 ByteArrayInputStream bis = new ByteArrayInputStream(dp.getData()); DataInputStream dis = new DataInputStream(bis); System.out.println(dis.readLong()); ds.close(); } } |
通過ByteArrayInputStream、ByteArrayOutputStream可以傳遞對象。
【示例5】Person類(客戶端與服務器端都需要存在Person類)
class Person implements Serializable{ int age; String name; public Person(int age, String name) { super(); this.age = age; this.name = name; } } |
【示例6】客戶端
public class Client { public static void main(String[] args) throws Exception { Person person = new Person(20,"aa");
ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(person); byte[] b = bos.toByteArray();
//必須告訴數據包要發到哪里去 DatagramPacket dp = new DatagramPacket(b,b.length,new InetSocketAddress("localhost",8999)); //我本身占用9000端口向外面機器發數據包 DatagramSocket ds = new DatagramSocket(9000); ds.send(dp); ds.close(); } } |
【示例7】服務器端
public class Server { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(8999); byte[] b = new byte[1024]; DatagramPacket dp = new DatagramPacket(b,b.length);
ds.receive(dp); //阻塞式方法
ByteArrayInputStream bis = new ByteArrayInputStream(dp.getData()); ObjectInputStream ois = new ObjectInputStream(bis); Person person = (Person) ois.readObject(); System.out.println(person.name); ds.close(); } } |
「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發經驗,曾在神州數碼、航天院某所研發中心從事軟件設計及研發工作,從小白逐漸做到工程師、高級工程師、架構師。精通Java平臺軟件開發,精通JAVAEE,熟悉各種流行開發框架。
筆記包含從淺入深的六大部分:
A-Java入門階段
B-數據庫從入門到精通
C-手刃移動前端和Web前端
D-J2EE從了解到實戰
E-Java高級框架精解
F-Linux和Hadoop
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。