標籤:pre output 連接埠 釋放 tput 聯絡 另一個 建立 col
註:本文來自:簡書:jianshu
jijs
連結:http://www.jianshu.com/p/f8d78149a465
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
Socket構造
- public Socket()
構造一個Socket,因為沒有指定目標主機和連接埠,所以不會通過網路進行串連。
- public Socket(Proxy proxy)
通過一個代理構建一個未串連的Socket。
- public Socket(String host, int port)
通過一個主機和連接埠構建一個Socket。構造Socket的時候會串連目標主機,如果串連不到目標主機則會拋出IOException或UnknownHostException異常。
- public Socket(InetAddress address, int port)
通過一個InetAddress 和連接埠構建一個Socket,構造的時候也會進行串連目標主機,同3。
- public Socket(String host, int port, InetAddress localAddr, int localPort)
通過一個要串連的遠程主機和連接埠,並指定從本地哪個ip和連接埠串連。
- public Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
通過一個要串連的遠程主機和連接埠,並指定從本地哪個ip和連接埠串連。同5。
擷取Socket相關的資訊擷取遠程主機相關資訊
1 public SocketAddress getRemoteSocketAddress() 2 public InetAddress getInetAddress() 3 public int getPort()
擷取本地相關資訊
1 public SocketAddress getLocalSocketAddress() 2 public InetAddress getLocalAddress() 3 public int getLocalPort()
上面6個方法擷取本地和遠程主機連接埠相關的資訊。如果socket未串連則返回null,如果socket已經關閉則返回已經串連過的本地和遠程主機連接埠的資訊。
connect方法
1 public void connect(SocketAddress endpoint) 2 public void connect(SocketAddress endpoint, int timeout)
connet放提供了兩個方法,一個是傳入一個SocketAddress 進行串連目標地址
另一個是通過一個SocketAddress 和逾時等待時間來串連目標地址。
程式碼範例:
1 Socket socket = new Socket(); 2 SocketAddress socketAddr = new InetSocketAddress("www.baidu.com", 80); 3 socket.connect(socketAddr); 4 //socket.connect(socketAddr, 2000); 5
代碼中使用了Socket的空建構函式進行構造Socket對象。空構造不會進行串連目標主機(因為沒有設定目標地址),需要使用connet方法進行串連目標主機。
Proxy 伺服器
1 //構造Proxy 伺服器地址 2 SocketAddress sa = new InetSocketAddress("192.168.10.130", 808); 3 //構造Socket代理 4 Proxy proxy = new Proxy(Proxy.Type.SOCKS, sa); 5 //使用代理建立socket 6 Socket socket = new Socket(proxy); 7 //構造目標地址 8 SocketAddress socketAddr = new InetSocketAddress("www.baidu.com", 80); 9 //socket使用代理串連目標地址 10 socket.connect(socketAddr); 11
使用public Socket(Proxy proxy)構造方法來構造一個使用proxy的socket。
以後使用該socket的相關的網路操作都會通過Proxy 伺服器進行串連。
讀取、寫入資料
使用下面兩個放進行向遠程主機讀取資料和寫入資料進行互動。
1 public InputStream getInputStream() 2 public OutputStream getOutputStream()
通過這兩個方法我們可以發現,使用socket進行交換操作,其實就是對流的操作。
下面是使用getInputStream和getOutputStream方法對遠程主機進行交換的樣本。
1 Socket socket = new Socket("127.0.0.1", 9000); 2 OutputStream os = socket.getOutputStream(); 3 //通過OutputStream流向遠程伺服器寫如資料 4 ... 5 InputStream is = socket.getInputStream(); 6 //通過InputStream流讀取響應的資料。 7 ... 8 9 半關閉串連
如果想關閉socket的輸入或輸出則可以使用一下兩個方法。
1 public void shutdownInput() 2 public void shutdownOutput()
當調用shutdownInput()時,則不允許再次從socket中讀取資料。
當調用shutdownOutPut()方法後會告訴流已經輸入完成,不允許再次輸入。對方讀取流時,會接受到流結束標誌(會返回-1)。
但關閉輸入或輸出是不會關閉socket的,因為他們不會釋放本地連接埠,還需要調用socket的close()方法來關閉socket。
下面兩個方法來判斷socket的輸入或輸出資料流是否關閉。
1 public boolean isInputShutdown() 2 public boolean isOutputShutdown()
如果socket未串連(通過空構造方法構造的socket),也會返回false(未關閉狀態)。
判斷socket是否關閉
1 //是否串連過目標地址 2 public boolean isConnected() 3 //是否關閉過socket 4 public boolean isClosed()
isConnected方法並不是串連狀態才返回true,而是只要串連過目標地址就返回true,哪怕已經關閉的socket也會返回true的。
isClosed方法是判斷socket是否調用close()方法關閉過socket。
如果使用空構造方法構建socket而不串連目標主機,還沒調用close方法,該方法會返回true。
所以要判斷該socket是否串連目標地址需要這樣判斷
1 //開啟過串連,但還沒有關閉串連 2 if(socket.isConnected() && !socket.isClosed()){ 3 System.out.println("串連狀態"); 4 }else{ 5 System.out.println("未開啟串連或已經關閉串連"); 6 } 7 8
java.net.ServerSocket 解析