一、用戶端Socket 定義:Socket是兩台主機之間的一個串連,一單建立了串連,本地和遠程主機就從這個socket得到輸入資料流和輸出資料流,使用這個流可以同時發送和接收資料。Socket對程式員掩蓋了網路的底層細節,如錯誤偵測、包大小、包分解、包重傳、網路地址等。
1.構造和串連 Socket javanetSocket 類是java完成用戶端 TCP 操作的基礎類,這個類使用原生代碼與主機作業系統的本地 TCP 棧進行通訊。
建構函式:
pubic Socket(String host,int port) throws UnknownHostException,IOException public Socket(InetAddress host,int port) throws IOException /** 下面兩個建構函式可以指定本網介面和連接埠來串連,網路介面可以是物理介面也可以是虛擬介面,如果localPort傳入 0,java則會隨機播放 1024 到 65535 之間的一個可用連接埠 */ public Socket(String host,int port,InetAddress interface,int localPort) throws IOException,UnknownHostException public Socket(InetAddress host,int port,InetAddress interface,int localPort) throws IOException //看源碼其實可以發現傳入的參數其實是兩個 SocketAddress(Address + port),一個是串連的主機,一個是本網介面。 /** 以上的所有的構造方法中都會調用另外一個建構函式: public Socket (SocketAddress address,SocketAddress localAddr,boolean stream):在這個建構函式中會調用 bind(localAddress);connect(address);所以建立串連時是要先建立一個 Socket,然後調用 bind 方法開始綁定,最後調用 connect 方法進行串連。 所以以下3個建構函式是沒有進行串連的 */ public Socket() public Socket(Proxy proxy) protected Socket(SocketImpl impl)
當建立起了串連,這時候就可以開始相互發送資料了。
public InputStream getInputStream() throws IOException;//獲得輸入資料流,可以從中擷取服務端發來的資料 public OutputStream getOutputStream() throws IOException;//獲得輸出資料流,可以用其向服務端發送資料
半關閉 Socket
public void close();//同時關閉 Socket的輸入和輸出資料流 public void shutdownInput() throws IOException ;//關閉輸入資料流,shutdown方法並不關閉socket public void shutdownOutput() throws IOException ;//關閉輸出資料流,
擷取 Socket的資訊
public InetAddress getInetAddress();//返回遠程主機的地址 public int getPort();//返回遠程主機的連接埠 public InetAddress getLocalAddress();//返回本地主機的地址 public int getLocalPort();//返回本地主機的連接埠 public boolean isClosed();//是否已經關閉 public boolean isConnected();//表示的是:是否從未串連過一個遠程主機,只要串連過,就返回true
Socket選項:都有對應的getter 與 setter 方法
TCP_NODELAY:是否關閉 Socket 的緩衝,如果關閉了,則一旦就緒就會發送,而不會等到緩衝區滿 SO_LINGER:表示當socket關閉時如何處理尚未發送的資料報,可以設定延遲的秒數,一旦時間到,無論還有沒有資料都關閉串連。最大延遲時間為65535秒 SO_TIMEOUT:表示從socket擷取資料時,read方法會阻塞的時間長度。0為無限,也是預設值 SO_REVBUF:設定接收緩衝區的大小,頭層皮利用緩衝區提升網路的效能 SO_SNDBUF:設定發送緩衝區的大小,但是實際上會設定為發送 和 接收緩衝區大小較小的一個 SO_KEEPALIVE:用戶端會偶爾通過一個空閑串連發送一個資料包,以確保伺服器未崩潰 OOBINLINE:Out Of Band ,緊急資料,會立即發送 SO_REUSEADDR:重用連接埠,可能會出現前一個Socket 未接收的資料
2.Socket地址 定義:SocketAddress類表示一個串連端點,這是個空的抽象類別,其主要用途是為暫時的 Socket串連資訊(如 ip地址 和 連接埠)提供一個方便的儲存
方法:
public SocketAddress getRemoteSocketAddress();//返回的是所串連系統的地址 public SocketAddress getLocalSocketAddress();//返回的是發起串連的地址
子類 InetSocketAddress 建立:
public InetSocketAddress(InetAddress address,int port)