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?