欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Java中怎么實(shí)現(xiàn)Socket編程

這篇文章給大家介紹Java中怎么實(shí)現(xiàn)Socket編程,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

創(chuàng)新互聯(lián)建站專注于離石企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城開發(fā)。離石網(wǎng)站建設(shè)公司,為離石等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)

TCP和UDP通信

關(guān)于socket編程我們有兩種通信協(xié)議可以進(jìn)行選擇。一種是數(shù)據(jù)報(bào)通信,另一種就是流通信。

數(shù)據(jù)報(bào)通信

數(shù)據(jù)報(bào)通信協(xié)議,就是我們常說的UDP(User Data Protocol  用戶數(shù)據(jù)報(bào)協(xié)議)。UDP是一種無連接的協(xié)議,這就意味著我們每次發(fā)送數(shù)據(jù)報(bào)時(shí),需要同時(shí)發(fā)送本機(jī)的socket描述符和接收端的socket描述符。因此,我們?cè)诿看瓮ㄐ艜r(shí)都需要發(fā)送額外的數(shù)據(jù)。

流通信

流通信協(xié)議,也叫做TCP(Transfer Control  Protocol,傳輸控制協(xié)議)。和UDP不同,TCP是一種基于連接的協(xié)議。在使用流通信之前,我們必須在通信的一對(duì)兒socket之間建立連接。其中一個(gè)socket作為服務(wù)器進(jìn)行監(jiān)聽連接請(qǐng)求。另一個(gè)則作為客戶端進(jìn)行連接請(qǐng)求。一旦兩個(gè)socket建立好了連接,他們可以單向或雙向進(jìn)行數(shù)據(jù)傳輸。

讀到這里,我們多少有這樣的疑問,我們進(jìn)行socket編程使用UDP還是TCP呢。選擇基于何種協(xié)議的socket編程取決于你的具體的客戶端-服務(wù)器端程序的應(yīng)用場(chǎng)景。下面我們簡(jiǎn)單分析一下TCP和UDP協(xié)議的區(qū)別,或許可以幫助你更好地選擇使用哪種。

在UDP中,每次發(fā)送數(shù)據(jù)報(bào)時(shí),需要附帶上本機(jī)的socket描述符和接收端的socket描述符。而由于TCP是基于連接的協(xié)議,在通信的socket對(duì)之間需要在通信之前建立連接,因此會(huì)有建立連接這一耗時(shí)存在于TCP協(xié)議的socket編程。

在UDP中,數(shù)據(jù)報(bào)數(shù)據(jù)在大小上有64KB的限制。而TCP中也不存在這樣的限制。一旦TCP通信的socket對(duì)建立了連接,他們之間的通信就類似IO流,所有的數(shù)據(jù)會(huì)按照接受時(shí)的順序讀取。

UDP是一種不可靠的協(xié)議,發(fā)送的數(shù)據(jù)報(bào)不一定會(huì)按照其發(fā)送順序被接收端的socket接受。然后TCP是一種可靠的協(xié)議。接收端收到的包的順序和包在發(fā)送端的順序是一致的。

簡(jiǎn)而言之,TCP適合于諸如遠(yuǎn)程登錄(rlogin,telnet)和文件傳輸(FTP)這類的網(wǎng)絡(luò)服務(wù)。因?yàn)檫@些需要傳輸?shù)臄?shù)據(jù)的大小不確定。而UDP相比TCP更加簡(jiǎn)單輕量一些。UDP用來實(shí)現(xiàn)實(shí)時(shí)性較高或者丟包不重要的一些服務(wù)。在局域網(wǎng)中UDP的丟包率都相對(duì)比較低。

Java中的socket編程

下面的部分我將通過一些示例講解一下如何使用socket編寫客戶端和服務(wù)器端的程序。

注意:在接下來的示例中,我將使用基于TCP/IP協(xié)議的socket編程,因?yàn)檫@個(gè)協(xié)議遠(yuǎn)遠(yuǎn)比UDP/IP使用的要廣泛。并且所有的socket相關(guān)的類都位于java.net包下,所以在我們進(jìn)行socket編程時(shí)需要引入這個(gè)包。

客戶端編寫

開啟Socket

如果在客戶端,你需要寫下如下的代碼就可以打開一個(gè)socket。

String host = "127.0.0.1"; int port = 8919; Socket client = new Socket(host,  port);

上面代碼中,host即客戶端需要連接的機(jī)器,port就是服務(wù)器端用來監(jiān)聽請(qǐng)求的端口。在選擇端口時(shí),需要注意一點(diǎn),就是0~1023這些端口都已經(jīng)被系統(tǒng)預(yù)留了。這些端口為一些常用的服務(wù)所使用,比如郵件,F(xiàn)TP和HTTP。當(dāng)你在編寫服務(wù)器端的代碼,選擇端口時(shí),請(qǐng)選擇一個(gè)大于1023的端口。

寫入數(shù)據(jù)

接下來就是寫入請(qǐng)求數(shù)據(jù),我們從客戶端的socket對(duì)象中得到OutputStream對(duì)象,然后寫入數(shù)據(jù)后。很類似文件IO的處理代碼。

public class ClientSocket { public static void main(String args) { String  host = "127.0.0.1"; int port = 8919; try { Socket client = new Socket(host,  port); Writer writer = new OutputStreamWriter(client.getOutputStream);  writer.write("Hello From Client"); writer.flush; writer.close; client.close; }  catch (IOException e) { e.printStackTrace; } } }

關(guān)閉IO對(duì)象

類似文件IO,在讀寫數(shù)據(jù)完成后,我們需要對(duì)IO對(duì)象進(jìn)行關(guān)閉,以確保資源的正確釋放。

服務(wù)器端編寫

打開服務(wù)器端的socket

int port = 8919; ServerSocket server = new ServerSocket(port); Socket socket  = server.accept;

上面的代碼創(chuàng)建了一個(gè)服務(wù)器端的socket,然后調(diào)用accept方法監(jiān)聽并獲取客戶端的請(qǐng)求socket。accept方法是一個(gè)阻塞方法,在服務(wù)器端與客戶端之間建立聯(lián)系之前會(huì)一直等待阻塞。

讀取數(shù)據(jù)

通過上面得到的socket對(duì)象獲取InputStream對(duì)象,然后安裝文件IO一樣讀取數(shù)據(jù)即可。這里我們將內(nèi)容打印出來。

public class ServerClient { public static void main(String args) { int port =  8919; try { ServerSocket server = new ServerSocket(port); Socket socket =  server.accept; Reader reader = new InputStreamReader(socket.getInputStream);  char chars = new char[1024]; int len; StringBuilderbuilder = new StringBuilder;  while ((len=reader.read(chars)) != -1) { builder.append(new String(chars, 0,  len)); } System.out.println("Receive from client message=: " + builder);  reader.close; socket.close; server.close; } catch (Exception e) {  e.printStackTrace; } } }

關(guān)閉IO對(duì)象

還是不能忘記的,***需要正確地關(guān)閉IO對(duì)象,以確保資源的正確釋放。

附注一個(gè)例子

這里我們?cè)黾右粋€(gè)例子,使用socket實(shí)現(xiàn)一個(gè)回聲服務(wù)器,就是服務(wù)器會(huì)將客戶端發(fā)送過來的數(shù)據(jù)傳回給客戶端。代碼很簡(jiǎn)單。

import java.io.*; import java.net.*; public class EchoServer { public static  void main(String args) { // declaration section: // declare a server socket and  a client socket for the server // declare an input and an output stream  ServerSocket echoServer = null; String line; DataInputStream is; PrintStream os;  Socket clientSocket = null; // Try to open a server socket on port 9999 // Note  that we can't choose a port less than 1023 if we are not // privileged users  (root) try { echoServer = new ServerSocket(9999); } catch (IOException e) {  System.out.println(e); } // Create a socket object from the ServerSocket to  listen and accept // connections. // Open input and output streams try {  clientSocket = echoServer.accept; is = new  DataInputStream(clientSocket.getInputStream); os = new  PrintStream(clientSocket.getOutputStream); // As long as we receive data, echo  that data back to the client. while (true) { line = is.readLine;  os.println(line); } } catch (IOException e) { System.out.println(e); } } }

編譯運(yùn)行上面的代碼,進(jìn)行如下請(qǐng)求,就可以看到客戶端請(qǐng)求攜帶的數(shù)據(jù)的內(nèi)容。

15:00 $ curl http://127.0.0.1:9999/?111 GET /?111 HTTP/1.1 User-Agent:  curl/7.37.1 Host: 127.0.0.1:9999 Accept: */*總結(jié)

進(jìn)行客戶端-服務(wù)器端編程還是比較有趣的,同時(shí)在Java中進(jìn)行socket編程要比其他語言(如C)要簡(jiǎn)單快速編寫。

java.net這個(gè)包里面包含了很多強(qiáng)大靈活的類供開發(fā)者進(jìn)行網(wǎng)絡(luò)編程,在進(jìn)行網(wǎng)絡(luò)編程中,建議使用這個(gè)包下面的API。同時(shí)Sun.*這個(gè)包也包含了很多的網(wǎng)絡(luò)編程相關(guān)的類,但是不建議使用這個(gè)包下面的API,因?yàn)檫@個(gè)包可能會(huì)改變,另外這個(gè)包不能保證在所有的平臺(tái)都有包含。

關(guān)于Java中怎么實(shí)現(xiàn)Socket編程就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

標(biāo)題名稱:Java中怎么實(shí)現(xiàn)Socket編程
網(wǎng)頁地址:http://aaarwkj.com/article8/goodop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、小程序開發(fā)網(wǎng)站改版、品牌網(wǎng)站制作用戶體驗(yàn)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
深夜福利视频一区二区| 蜜臀一二区免费在线视频| 视频一区日本视频二区| 欧美日韩亚洲激情一区| 精品人妻一区二区三区mp4| 亚洲a∨乱码一区二区三区蜜臀 | 国产精品一区二区三区久久| 久久伊人这里都是精品| 欧美日韩国产激情另类| 人妖激情一区二区三区| 欧美黄色一区二区三区精品| 农村精品少妇久久久久久| 九九有点热以前的视频| 美女性生活免费视频网站| 亚洲av一区二区三区| 精品少妇高潮蜜臀av| 麻豆印象传媒在线观看| 久久国产精品乱码电影| 中文字幕日韩一区二区| 日本韩国一区二区精品| 亚洲男人天堂超碰在线| 国产精品一区二区三区激情 | 国产伦理自拍视频在线观看| 日韩中文字幕一二三| 日韩欧美在线观看一区二区| 精品成人18亚洲av播放| 午夜毛片免费在线播放| 韩国久久久久三级成人| 精品一区二区三区乱码中文| 亚洲欧美成人免费视频| 亚洲一区麻豆文化传媒| 亚洲精品一区二区三区色| 国产熟女乱免费一区二区| 国产精品黄色自拍合集| 美女网站色在线免费观看午夜精品 | 成人亚洲理论片在线观看| 亚洲最大av免费在线看| 日本五十路亲子在线一区| 中文字幕一区中出爽亚洲| 青青草原这里只有精品| 人妻系列少妇人妻偷人|