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對(duì)象,在客戶端產(chǎn)生一個(gè)DatagramSocket對(duì)象。服務(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對(duì)象撬统,封裝待發(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可以傳遞對(duì)象罚屋。

【示例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筆記」是一部能幫大家從零到一成長(zhǎng)為全棧Java工程師系列筆記苦囱。筆者江湖人稱 Mr. G,10年Java研發(fā)經(jīng)驗(yàn)脾猛,曾在神州數(shù)碼撕彤、航天院某所研發(fā)中心從事軟件設(shè)計(jì)及研發(fā)工作,從小白逐漸做到工程師猛拴、高級(jí)工程師羹铅、架構(gòu)師。精通Java平臺(tái)軟件開發(fā)愉昆,精通JAVAEE职员,熟悉各種流行開發(fā)框架。


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

?A-Java入門階段

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

?C-手刃移動(dòng)前端和Web前端

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

?E-Java高級(jí)框架精解

?F-Linux和Hadoop?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跛溉,一起剝皮案震驚了整個(gè)濱河市焊切,隨后出現(xiàn)的幾起案子扮授,更是在濱河造成了極大的恐慌,老刑警劉巖蛛蒙,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糙箍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡牵祟,警方通過查閱死者的電腦和手機(jī)深夯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诺苹,“玉大人咕晋,你說我怎么就攤上這事∈毡迹” “怎么了掌呜?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)坪哄。 經(jīng)常有香客問我质蕉,道長(zhǎng),這世上最難降的妖魔是什么翩肌? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任模暗,我火速辦了婚禮,結(jié)果婚禮上念祭,老公的妹妹穿的比我還像新娘兑宇。我一直安慰自己,他們只是感情好粱坤,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布隶糕。 她就那樣靜靜地躺著,像睡著了一般站玄。 火紅的嫁衣襯著肌膚如雪枚驻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天株旷,我揣著相機(jī)與錄音再登,去河邊找鬼。 笑死灾常,一個(gè)胖子當(dāng)著我的面吹牛霎冯,可吹牛的內(nèi)容都是我干的铃拇。 我是一名探鬼主播钞瀑,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼慷荔!你這毒婦竟也來了雕什?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贷岸,沒想到半個(gè)月后壹士,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡偿警,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年躏救,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片螟蒸。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盒使,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出七嫌,到底是詐尸還是另有隱情少办,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布诵原,位于F島的核電站英妓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绍赛。R本人自食惡果不足惜蔓纠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惹资。 院中可真熱鬧贺纲,春花似錦、人聲如沸褪测。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侮措。三九已至懈叹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間分扎,已是汗流浹背澄成。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畏吓,地道東北人墨状。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像菲饼,于是被迫代替她去往敵國(guó)和親肾砂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 前言 多年以前自學(xué)Java宏悦,在本地做了一些筆記镐确。最近幾年流行播客包吝,一方面防止丟失,一方面可以幫助其他小伙伴...
    chaohx閱讀 1,033評(píng)論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理源葫,服務(wù)發(fā)現(xiàn)诗越,斷路器,智...
    卡卡羅2017閱讀 134,693評(píng)論 18 139
  • 1 網(wǎng)絡(luò)編程----UDPNo25 【Scanner scanner =new Scanner(System....
    征程_Journey閱讀 458評(píng)論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法息堂,類相關(guān)的語法嚷狞,內(nèi)部類的語法,繼承相關(guān)的語法荣堰,異常的語法感耙,線程的語...
    子非魚_t_閱讀 31,660評(píng)論 18 399
  • 雨, 小到?jīng)]有滴答回應(yīng) 風(fēng)持隧, 息到?jīng)]有搖擺婆娑 光即硼, 籠到?jīng)]有七彩描白 淅淅瀝瀝,冷冷清清 這一場(chǎng) 春雨 不急不躁...
    陸河閱讀 226評(píng)論 1 1