java.net.Socket 解析
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相關的信息
獲取遠程主機相關信息
public SocketAddress getRemoteSocketAddress() public InetAddress getInetAddress() public int getPort()獲取本地相關信息
public SocketAddress getLocalSocketAddress() public InetAddress getLocalAddress() public int getLocalPort()上面6個方法獲取本地和遠程主機端口相關的信息。如果socket未連接則返回null,如果socket已經關閉則返回已經連接過的本地和遠程主機端口的信息。
connect方法
public void connect(SocketAddress endpoint) public void connect(SocketAddress endpoint, int timeout)connet放提供了兩個方法,一個是傳入一個SocketAddress 進行連接目標地址
另一個是通過一個SocketAddress 和超時等待時間來連接目標地址。
代碼示例:
Socket socket = new Socket(); SocketAddress socketAddr = new InetSocketAddress("www.baidu.com", 80); socket.connect(socketAddr); //socket.connect(socketAddr, 2000);代碼中使用了Socket的空構造函數進行構造Socket對象。空構造不會進行連接目標主機(因為沒有設置目標地址),需要使用connet方法進行連接目標主機。
代理服務器
//構造代理服務器地址 SocketAddress sa = new InetSocketAddress("192.168.10.130", 808); //構造Socket代理 Proxy proxy = new Proxy(Proxy.Type.SOCKS, sa); //使用代理創建socket Socket socket = new Socket(proxy); //構造目標地址 SocketAddress socketAddr = new InetSocketAddress("www.baidu.com", 80); //socket使用代理連接目標地址 socket.connect(socketAddr);使用public Socket(Proxy proxy)構造方法來構造一個使用proxy的socket。
以后使用該socket的相關的網絡操作都會通過代理服務器進行連接。
讀取、寫入數據
使用下面兩個放進行向遠程主機讀取數據和寫入數據進行交互。
public InputStream getInputStream() public OutputStream getOutputStream()通過這兩個方法我們可以發現,使用socket進行交換操作,其實就是對流的操作。
下面是使用getInputStream和getOutputStream方法對遠程主機進行交換的示例。
Socket socket = new Socket("127.0.0.1", 9000); OutputStream os = socket.getOutputStream(); //通過OutputStream流向遠程服務器寫如數據 ... InputStream is = socket.getInputStream(); //通過InputStream流讀取響應的數據。 ...半關閉連接
如果想關閉socket的輸入或輸出則可以使用一下兩個方法。
public void shutdownInput() public void shutdownOutput()當調用shutdownInput()時,則不允許再次從socket中讀取數據。
當調用shutdownOutPut()方法后會告訴流已經輸入完成,不允許再次輸入。對方讀取流時,會接受到流結束標志(會返回-1)。
但關閉輸入或輸出是不會關閉socket的,因為他們不會釋放本地端口,還需要調用socket的close()方法來關閉socket。
下面兩個方法來判斷socket的輸入或輸出流是否關閉。
public boolean isInputShutdown() public boolean isOutputShutdown()如果socket未連接(通過空構造方法構造的socket),也會返回false(未關閉狀態)。
判斷socket是否關閉
//是否連接過目標地址 public boolean isConnected() //是否關閉過socket public boolean isClosed()isConnected方法并不是連接狀態才返回true,而是只要連接過目標地址就返回true,哪怕已經關閉的socket也會返回true的。
isClosed方法是判斷socket是否調用close()方法關閉過socket。
如果使用空構造方法構建socket而不連接目標主機,還沒調用close方法,該方法會返回true。
所以要判斷該socket是否連接目標地址需要這樣判斷
//打開過連接,但還沒有關閉連接 if(socket.isConnected() && !socket.isClosed()){System.out.println("連接狀態"); }else{System.out.println("未打開連接或已經關閉連接"); }本人簡書blog地址:http://www.jianshu.com/u/1f0067e24ff8????
點擊這里快速進入簡書
GIT地址:http://git.oschina.net/brucekankan/
點擊這里快速進入GIT
總結
以上是生活随笔為你收集整理的java.net.Socket 解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HttpURLConnection 中C
- 下一篇: java.net.ServerSocke