日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java.net.Socket 解析

發布時間:2024/9/30 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。