閱讀987 返回首頁    go 技術社區[雲棲]


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

最後更新:2017-05-23 16:33:19

  上一篇:go  2.4 監管和監測
  下一篇:go  麵向大眾的移動技術:簽名,封裝和發布Android app