java.net.ServerSocket 解析

來源:互聯網
上載者:User

標籤:pre   output   連接埠   釋放   tput   聯絡   另一個   建立   col   

註:本文來自:簡書:jianshu

jijs
連結:http://www.jianshu.com/p/f8d78149a465
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

Socket構造
  1. public Socket()


    構造一個Socket,因為沒有指定目標主機和連接埠,所以不會通過網路進行串連。

  2. public Socket(Proxy proxy)


    通過一個代理構建一個未串連的Socket。

  3. public Socket(String host, int port)


    通過一個主機和連接埠構建一個Socket。構造Socket的時候會串連目標主機,如果串連不到目標主機則會拋出IOException或UnknownHostException異常。

  4. public Socket(InetAddress address, int port)


    通過一個InetAddress 和連接埠構建一個Socket,構造的時候也會進行串連目標主機,同3。

  5. public Socket(String host, int port, InetAddress localAddr, int localPort)


    通過一個要串連的遠程主機和連接埠,並指定從本地哪個ip和連接埠串連。

  6. 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 解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.