12.7-全棧Java筆記:Java網(wǎng)絡(luò)編程(五)

UDP通訊的實(shí)現(xiàn)

1.DatagramSocket:用于發(fā)送或接收數(shù)據(jù)包

當(dāng)服務(wù)器要向客戶端發(fā)送數(shù)據(jù)時(shí),需要在服務(wù)器端產(chǎn)生一個(gè)DatagramSocket對象,在客戶端產(chǎn)生一個(gè)DatagramSocket對象。服務(wù)器端的DatagramSocket將DatagramPacket發(fā)送到網(wǎng)絡(luò)上,然后被客戶端的DatagramSocket接收。

DatagramSocket有兩種構(gòu)造函數(shù)。一種是無需任何參數(shù)的,常用于客戶端。另一種需要指定端口,常用于服務(wù)器。

常用方法:send、receive、 close

?

2.DatagramPacket:數(shù)據(jù)容器(封包)的作用

常用方法:構(gòu)造函數(shù)、getAddrress(獲取發(fā)送或接收方計(jì)算機(jī)的IP地址)、getData(獲取發(fā)送或接收的數(shù)據(jù))、setData(設(shè)置發(fā)送的數(shù)據(jù))

3.UDP通信編程基本步驟:

a)創(chuàng)建客戶端的DatagramSocket,創(chuàng)建時(shí),定義客戶端的監(jiān)聽端口

b)創(chuàng)建服務(wù)器端的DatagramSocket,創(chuàng)建時(shí),定義服務(wù)器端的監(jiān)聽端口

c)在服務(wù)器端定義DatagramPacket對象,封裝待發(fā)送的數(shù)據(jù)包。

d)服務(wù)器端將數(shù)據(jù)包發(fā)送出去

e)客戶端接收數(shù)據(jù)包

【示例1】客戶端與服務(wù)器端單向通信之客戶端

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();

??????? //必須告訴數(shù)據(jù)包要發(fā)到哪里去

?????? DatagramPacket dp =?new?DatagramPacket(b,b.length,new?? InetSocketAddress("localhost",8999));

???????//我本身占用9000端口向外面機(jī)器發(fā)數(shù)據(jù)包

?????? DatagramSocket ds =?new?DatagramSocket(9000);

?????? ds.send(dp);

?????? ds.close();

??? }

}?

【示例2】客戶端與服務(wù)器端單向通信之服務(wù)器端

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()返回實(shí)際收到的數(shù)據(jù)的字節(jié)數(shù)

?????? System.out.println(string);

?????? ds.close();

??? }

}

通過ByteArrayInputStream、ByteArrayOutputStream可以傳遞基本類型數(shù)據(jù)。

【示例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();

?????? //必須告訴數(shù)據(jù)包要發(fā)到哪里去

?????? DatagramPacket dp =?new?DatagramPacket(b,b.length,new?? InetSocketAddress("localhost",8999));

?????? //我本身占用9000端口向外面機(jī)器發(fā)數(shù)據(jù)包

?????? DatagramSocket ds =?new?DatagramSocket(9000);

?????? ds.send(dp);

?????? ds.close();

??? }

}?

【示例4】服務(wù)器端

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(客戶端與服務(wù)器端都需要存在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();

?????? //必須告訴數(shù)據(jù)包要發(fā)到哪里去

?????? DatagramPacket dp =?new?DatagramPacket(b,b.length,new?? InetSocketAddress("localhost",8999));

?????? //我本身占用9000端口向外面機(jī)器發(fā)數(shù)據(jù)包

?????? DatagramSocket ds =?new?DatagramSocket(9000);

?????? ds.send(dp);

?????? ds.close();

??? }

} ?

【示例7】服務(wù)器端

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研發(fā)經(jīng)驗(yàn),曾在神州數(shù)碼、航天院某所研發(fā)中心從事軟件設(shè)計(jì)及研發(fā)工作,從小白逐漸做到工程師、高級工程師、架構(gòu)師。精通Java平臺軟件開發(fā),精通JAVAEE,熟悉各種流行開發(fā)框架。


?筆記包含從淺入深的六大部分:

?A-Java入門階段

?B-數(shù)據(jù)庫從入門到精通

?C-手刃移動前端和Web前端

?D-J2EE從了解到實(shí)戰(zhàn)

?E-Java高級框架精解

?F-Linux和Hadoop?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 1 網(wǎng)絡(luò)編程----UDPNo25 【Scanner scanner =new Scanner(System....
    征程_Journey閱讀 500評論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,625評論 18 399
  • 雨, 小到?jīng)]有滴答回應(yīng) 風(fēng), 息到?jīng)]有搖擺婆娑 光, 籠到?jīng)]有七彩描白 淅淅瀝瀝,冷冷清清 這一場 春雨 不急不躁...
    陸河閱讀 261評論 1 1
  • 接到表達(dá)愛的題目,我一下想到的不是為了夫妻之間的愛,也不是母子間愛,而是想到了我們幾個(gè)閨蜜之間的愛! 其實(shí)算算,現(xiàn)...
    翰寶媽媽閱讀 567評論 0 50

友情鏈接更多精彩內(nèi)容