亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中怎么實現Socket編程

發布時間:2021-07-01 17:29:53 來源:億速云 閱讀:198 作者:Leah 欄目:編程語言

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

TCP和UDP通信

關于socket編程我們有兩種通信協議可以進行選擇。一種是數據報通信,另一種就是流通信。

數據報通信

數據報通信協議,就是我們常說的UDP(User Data Protocol  用戶數據報協議)。UDP是一種無連接的協議,這就意味著我們每次發送數據報時,需要同時發送本機的socket描述符和接收端的socket描述符。因此,我們在每次通信時都需要發送額外的數據。

流通信

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

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

在UDP中,每次發送數據報時,需要附帶上本機的socket描述符和接收端的socket描述符。而由于TCP是基于連接的協議,在通信的socket對之間需要在通信之前建立連接,因此會有建立連接這一耗時存在于TCP協議的socket編程。

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

UDP是一種不可靠的協議,發送的數據報不一定會按照其發送順序被接收端的socket接受。然后TCP是一種可靠的協議。接收端收到的包的順序和包在發送端的順序是一致的。

簡而言之,TCP適合于諸如遠程登錄(rlogin,telnet)和文件傳輸(FTP)這類的網絡服務。因為這些需要傳輸的數據的大小不確定。而UDP相比TCP更加簡單輕量一些。UDP用來實現實時性較高或者丟包不重要的一些服務。在局域網中UDP的丟包率都相對比較低。

Java中的socket編程

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

注意:在接下來的示例中,我將使用基于TCP/IP協議的socket編程,因為這個協議遠遠比UDP/IP使用的要廣泛。并且所有的socket相關的類都位于java.net包下,所以在我們進行socket編程時需要引入這個包。

客戶端編寫

開啟Socket

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

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

上面代碼中,host即客戶端需要連接的機器,port就是服務器端用來監聽請求的端口。在選擇端口時,需要注意一點,就是0~1023這些端口都已經被系統預留了。這些端口為一些常用的服務所使用,比如郵件,FTP和HTTP。當你在編寫服務器端的代碼,選擇端口時,請選擇一個大于1023的端口。

寫入數據

接下來就是寫入請求數據,我們從客戶端的socket對象中得到OutputStream對象,然后寫入數據后。很類似文件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; } } }

關閉IO對象

類似文件IO,在讀寫數據完成后,我們需要對IO對象進行關閉,以確保資源的正確釋放。

服務器端編寫

打開服務器端的socket

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

上面的代碼創建了一個服務器端的socket,然后調用accept方法監聽并獲取客戶端的請求socket。accept方法是一個阻塞方法,在服務器端與客戶端之間建立聯系之前會一直等待阻塞。

讀取數據

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

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; } } }

關閉IO對象

還是不能忘記的,***需要正確地關閉IO對象,以確保資源的正確釋放。

附注一個例子

這里我們增加一個例子,使用socket實現一個回聲服務器,就是服務器會將客戶端發送過來的數據傳回給客戶端。代碼很簡單。

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

編譯運行上面的代碼,進行如下請求,就可以看到客戶端請求攜帶的數據的內容。

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: */*總結

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

java.net這個包里面包含了很多強大靈活的類供開發者進行網絡編程,在進行網絡編程中,建議使用這個包下面的API。同時Sun.*這個包也包含了很多的網絡編程相關的類,但是不建議使用這個包下面的API,因為這個包可能會改變,另外這個包不能保證在所有的平臺都有包含。

關于Java中怎么實現Socket編程就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宕昌县| 成都市| 紫金县| 万荣县| 广灵县| 德昌县| 怀宁县| 阳曲县| 巫溪县| 金塔县| 三门县| 新化县| 红安县| 湘西| 瑞金市| 库伦旗| 广宁县| 河间市| 菏泽市| 扎鲁特旗| 九龙县| 仲巴县| 昌江| 阿拉尔市| 庄浪县| 永德县| 连山| 甘泉县| 谢通门县| 洪湖市| 富裕县| 葵青区| 广宗县| 开封县| 新巴尔虎右旗| 红河县| 都昌县| 拉孜县| 台州市| 双流县| 化隆|