12.7-全棧Java筆記:Java網絡編程(五)

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可以傳遞對象。

【示例5Person(客戶端與服務器端都需要存在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?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 前言 多年以前自學Java,在本地做了一些筆記。最近幾年流行播客,一方面防止丟失,一方面可以幫助其他小伙伴...
    chaohx閱讀 1,044評論 0 3
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • 1 網絡編程----UDPNo25 【Scanner scanner =new Scanner(System....
    征程_Journey閱讀 467評論 0 0
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,779評論 18 399
  • 雨, 小到沒有滴答回應 風, 息到沒有搖擺婆娑 光, 籠到沒有七彩描白 淅淅瀝瀝,冷冷清清 這一場 春雨 不急不躁...
    陸河閱讀 235評論 1 1