Java網(wǎng)絡(luò)編程基礎(chǔ)教程之Socket入門(mén)實(shí)例
當(dāng)我們想要在Java中使用TCP/IP通過(guò)網(wǎng)絡(luò)連接到服務(wù)器時(shí),就需要?jiǎng)?chuàng)建java.net.Socket對(duì)象并連接到服務(wù)器。假如希望使用Java NIO,也可以創(chuàng)建Java NIO中的SocketChannel對(duì)象。
創(chuàng)建Socket
下面的示例代碼是連接到IP地址為78.64.84.171服務(wù)器上的80端口,這臺(tái)服務(wù)器就是我們的Web服務(wù)器(www.dhdzp.com),而80端口就是Web服務(wù)端口。
Socket socket = new Socket("78.46.84.171", 80);
我們也可以像如下示例中使用域名代替IP地址:
Socket socket = new Socket("jb51.net", 80);
Socket發(fā)送數(shù)據(jù)
要通過(guò)Socket發(fā)送數(shù)據(jù),我們需要獲取Socket的輸出流(OutputStream),示例代碼如下:
Socket socket = new Socket("jb51.net", 80);
OutputStream out = socket.getOutputStream();
out.write("some data".getBytes());
out.flush();
out.close();
socket.close();
代碼非常簡(jiǎn)單,但是想要通過(guò)網(wǎng)絡(luò)將數(shù)據(jù)發(fā)送到服務(wù)器端,一定不要忘記調(diào)用flush()方法。操作系統(tǒng)底層的TCP/IP實(shí)現(xiàn)會(huì)先將數(shù)據(jù)放入一個(gè)更大的數(shù)據(jù)緩存塊中,而緩存塊的大小是與TCP/IP的數(shù)據(jù)包大小相適應(yīng)的。(譯者注:調(diào)用flush()方法只是將數(shù)據(jù)寫(xiě)入操作系統(tǒng)緩存中,并不保證數(shù)據(jù)會(huì)立即發(fā)送)
Socket讀取數(shù)據(jù)
從Socket中讀取數(shù)據(jù),我們就需要獲取Socket的輸入流(InputStream),代碼如下:
Socket socket = new Socket("jb51.net", 80);
InputStream in = socket.getInputStream();
int data = in.read();
//... read more data...
in.close();
socket.close();
代碼也并不復(fù)雜,但需要注意的是,從Socket的輸入流中讀取數(shù)據(jù)并不能讀取文件那樣,一直調(diào)用read()方法直到返回-1為止,因?yàn)閷?duì)Socket而言,只有當(dāng)服務(wù)端關(guān)閉連接時(shí),Socket的輸入流才會(huì)返回-1,而是事實(shí)上服務(wù)器并不會(huì)不停地關(guān)閉連接。假設(shè)我們想要通過(guò)一個(gè)連接發(fā)送多個(gè)請(qǐng)求,那么在這種情況下關(guān)閉連接就顯得非常愚蠢。
因此,從Socket的輸入流中讀取數(shù)據(jù)時(shí)我們必須要知道需要讀取的字節(jié)數(shù),這可以通過(guò)讓服務(wù)器在數(shù)據(jù)中告知發(fā)送了多少字節(jié)來(lái)實(shí)現(xiàn),也可以采用在數(shù)據(jù)末尾設(shè)置特殊字符標(biāo)記的方式連實(shí)現(xiàn)。
關(guān)閉Socket
當(dāng)使用完Socket后我們必須將Socket關(guān)閉,斷開(kāi)與服務(wù)器之間的連接。關(guān)閉Socket只需要調(diào)用Socket.close()方法即可,代碼如下:
Socket socket = new Socket("jb51.net", 80);
socket.close();
(全文完)
- Java 網(wǎng)絡(luò)編程socket編程等詳解
- Java基于Socket實(shí)現(xiàn)網(wǎng)絡(luò)編程實(shí)例詳解
- 簡(jiǎn)單講解Java的Socket網(wǎng)絡(luò)編程的多播與廣播實(shí)現(xiàn)
- Java的Socket網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)入門(mén)教程
- Java套接字(Socket)網(wǎng)絡(luò)編程入門(mén)
- java網(wǎng)絡(luò)編程之socket網(wǎng)絡(luò)編程示例(服務(wù)器端/客戶端)
- Java網(wǎng)絡(luò)編程實(shí)現(xiàn)的簡(jiǎn)單端口掃描器示例
- Java網(wǎng)絡(luò)編程教程之設(shè)置請(qǐng)求超時(shí)的方法
- Java網(wǎng)絡(luò)編程之TCP通信完整代碼示例
- 詳解Java網(wǎng)絡(luò)編程
相關(guān)文章
Spring MVC攔截器(Interceptor)的定義和配置過(guò)程
這篇文章主要介紹了Spring MVC攔截器(Interceptor)的定義和配置過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
springboot+springsecurity如何實(shí)現(xiàn)動(dòng)態(tài)url細(xì)粒度權(quán)限認(rèn)證
這篇文章主要介紹了springboot+springsecurity如何實(shí)現(xiàn)動(dòng)態(tài)url細(xì)粒度權(quán)限認(rèn)證的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Redis 訂閱發(fā)布_Jedis實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇Redis 訂閱發(fā)布_Jedis實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
springboot整合redis進(jìn)行數(shù)據(jù)操作(推薦)
springboot整合redis比較簡(jiǎn)單,并且使用redistemplate可以讓我們更加方便的對(duì)數(shù)據(jù)進(jìn)行操作。下面通過(guò)本文給大家分享springboot整合redis進(jìn)行數(shù)據(jù)操作的相關(guān)知識(shí),感興趣的朋友一起看看吧2017-10-10
springboot實(shí)現(xiàn)分段上傳功能的示例代碼
這篇文章主要介紹了springboot實(shí)現(xiàn)分段上傳,包括文件上傳下載,斷點(diǎn)續(xù)傳,增量上傳功能,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
SpringBoot集成Curator實(shí)現(xiàn)Zookeeper基本操作的代碼示例
Zookeeper是一個(gè)Apache開(kāi)源的分布式的應(yīng)用,為系統(tǒng)架構(gòu)提供協(xié)調(diào)服務(wù),ZooKeeper的目標(biāo)就是封裝好復(fù)雜易出錯(cuò)的關(guān)鍵服務(wù),將簡(jiǎn)單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶,本文給大家介紹了SpringBoot集成Curator實(shí)現(xiàn)Zookeeper基本操作,需要的朋友可以參考下2024-05-05
Spring AOP方法內(nèi)部調(diào)用不生效的解決方案
最近有個(gè)需求,統(tǒng)計(jì)某個(gè)方法的調(diào)用次數(shù),開(kāi)始使用 Spring AOP 實(shí)現(xiàn),后來(lái)發(fā)現(xiàn)當(dāng)方法被內(nèi)部調(diào)用時(shí),切面邏輯將不會(huì)生效,所以本文就給大家介紹了Spring AOP方法內(nèi)部調(diào)用不生效的解決方案,需要的朋友可以參考下2025-01-01
SpringCloud gateway request的body驗(yàn)證或修改方式
這篇文章主要介紹了SpringCloud gateway request的body驗(yàn)證或修改方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07

