987
技術社區[雲棲]
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
上一篇:
2.4 監管和監測
下一篇:
麵向大眾的移動技術:簽名,封裝和發布Android app
7月13日雲棲精選夜讀:什麼才是這個時代最需要的BI人員? —— 阿裏雲MVP趙瑋主題分享
教程 | 一個基於TensorFlow的簡單故事生成案例:帶你了解LSTM
無線入侵檢測讓無線安全檢測變得簡單
餓了麼四次技術進化的曲折路,記訪談張雪峰
談談關於PHP的代碼安全相關的一些致命知識
【android錯誤】bitmap size exceeds 32bits
《Apache Zookeeper 官方文檔》管理分布式係統就像管理動物園一樣
數據科學家和工程師:各霸一方,一旦聯手,所向披靡
Oracle E-Delivery網站發布了ALBPM 6.0.4最新版本,而不是通過BEA的網站進行發布
50 種係統免遭黑客侵襲的方法 [2017 年版]