Java網絡教程之Socket

杜老師說 2022-01-07 11:24:25 阅读数:682

java 教程 程之 socket

原文地址  譯者:賈毅

當我們想要在Java中使用TCP/IP通過網絡連接到服務器時,就需要創建java.net.Socket對象並連接到服務器。假如希望使用Java NIO,也可以創建Java NIO中的SocketChannel對象。

創建Socket

下面的示例代碼是連接到IP地址為78.64.84.171服務器上的80端口,這臺服務器就是我們的Web服務器(www.jenkov.com),而80端口就是Web服務端口。

Socket socket = new Socket("78.46.84.171", 80);

我們也可以像如下示例中使用域名代替IP地址:

Socket socket = new Socket("jenkov.com", 80);

Socket發送數據

要通過Socket發送數據,我們需要獲取Socket的輸出流(OutputStream),示例代碼如下:

Socket socket = new Socket("jenkov.com", 80);OutputStream out = socket.getOutputStream(); out.write("some data".getBytes());out.flush();out.close(); socket.close();

代碼非常簡單,但是想要通過網絡將數據發送到服務器端,一定不要忘記調用flush()方法。操作系統底層的TCP/IP實現會先將數據放入一個更大的數據緩存塊中,而緩存塊的大小是與TCP/IP的數據包大小相適應的。(譯者注:調用flush()方法只是將數據寫入操作系統緩存中,並不保證數據會立即發送)

Socket讀取數據

從Socket中讀取數據,我們就需要獲取Socket的輸入流(InputStream),代碼如下:

Socket socket = new Socket("jenkov.com", 80);InputStream in = socket.getInputStream(); int data = in.read();//... read more data... in.close();socket.close();

代碼也並不複雜,但需要注意的是,從Socket的輸入流中讀取數據並不能讀取文件那樣,一直調用read()方法直到返回-1為止,因為對Socket而言,只有當服務端關閉連接時,Socket的輸入流才會返回-1,而是事實上服務器並不會不停地關閉連接。假設我們想要通過一個連接發送多個請求,那麼在這種情况下關閉連接就顯得非常愚蠢。

因此,從Socket的輸入流中讀取數據時我們必須要知道需要讀取的字節數,這可以通過讓服務器在數據中告知發送了多少字節來實現,也可以采用在數據末尾設置特殊字符標記的方式連實現。

關閉Socket

當使用完Socket後我們必須將Socket關閉,斷開與服務器之間的連接。關閉Socket只需要調用Socket.close()方法即可,代碼如下:

Socket socket = new Socket("jenkov.com", 80); socket.close();

原創文章,轉載請注明: 轉載自並發編程網 – ifeve.com本文鏈接地址: Java網絡教程之Socket

FavoriteLoading添加本文到我的收藏
版权声明:本文为[杜老師說]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201071124247066.html