Socket和ServerSocket學習筆記

2021-06-29 15:20:09 字數 3491 閱讀 5403

對於即時類應用或者即時類的遊戲,http協議很多時候無法滿足於我們的需求。這會,socket對於我們來說就非常實用了。下面是本次學習的筆記。主要分異常型別、互動原理、socket、serversocket、多執行緒這幾個方面闡述。

異常型別

在了解socket的內容之前,先要了解一下涉及到的一些異常型別。以下四種型別都是繼承於ioexception,所以很多之後直接彈出ioexception即可。

unkownhostexception:      主機名字或ip錯誤

connectexception:        伺服器拒絕連線、伺服器沒有啟動、(超出佇列數,拒絕連線)

sockettimeoutexception:      連線超時

bindexception:          socket物件無法與制定的本地ip位址或埠繫結

互動過程

socket與serversocket的互動,下面的我覺得已經說的很詳細很清楚了。

建構函式

socket()

socket(inetaddress address, int port)throws unknownhostexception, ioexception

socket(inetaddress address, int port, inetaddress localaddress, int localport)throws ioexception

socket(string host, int port)throws unknownhostexception, ioexception

socket(string host, int port, inetaddress localaddress, int localport)throws ioexception

除去第一種不帶引數的之外,其它建構函式會嘗試建立與伺服器的連線。如果失敗會丟擲ioexception錯誤。如果成功,則返回socket物件。

inetaddress是乙個用於記錄主機的類,其靜態gethostbyname(string msg)可以返回乙個例項,其靜態方法getlocalhost()也可以獲得當前主機的ip位址,並返回乙個例項。socket(string host, int port, inetaddress localaddress, int localport)建構函式的引數分別為目標ip、目標埠、繫結本地ip、繫結本地埠。

socket方法

getinetaddress();      遠端服務端的ip位址

getport();          遠端服務端的埠

getlocaladdress()      本地客戶端的ip位址

getlocalport()        本地客戶端的埠

getinputstream();     獲得輸入流

getoutstream();      獲得輸出流

值得注意的是,在這些方法裡面,最重要的就是getinputstream()和getoutputstream()了。

socket狀態

isclosed();            //連線是否已關閉,若關閉,返回true;否則返回false

isconnect();      //如果曾經連線過,返回true;否則返回false

isbound();            //如果socket已經與本地乙個埠繫結,返回true;否則返回false

如果要確認socket的狀態是否處於連線中,下面語句是很好的判斷方式。

boolean isconnection=socket.isconnected() && !socket.isclosed();   //

判斷當前是否處於連線

半關閉socket很多時候,我們並不知道在獲得的輸入流裡面到底讀多長才結束。下面是一些比較普遍的方法:

serversocket

建構函式

serversocket()throws ioexception

serversocket(int port)throws ioexception

serversocket(int port, int backlog)throws ioexception

serversocket(int port, int backlog, inetaddress bindaddr)throws ioexception

注意點:

1. port服務端要監聽的埠;backlog客戶端連線請求的佇列長度;bindaddr服務端繫結ip

2. 如果埠被占用或者沒有許可權使用某些埠會丟擲bindexception錯誤。譬如1~1023的埠需要管理員才擁有許可權繫結。

3. 如果設定埠為0,則系統會自動為其分配乙個埠;

4. bindaddr用於繫結伺服器ip,為什麼會有這樣的設定呢,譬如有些機器有多個網絡卡。

5. serversocket一旦繫結了監聽埠,就無法更改。serversocket()可以實現在繫結埠前設定其他的引數。

單執行緒的serversocket例子

public

void

service()catch(ioexception e)finally

catch

(ioexception e)}}

}

多執行緒的serversocket多執行緒的好處不用多說,而且大多數的場景都是多執行緒的,無論是我們的即時類遊戲還是im,多執行緒的需求都是必須的。下面說說實現方式:

實現多執行緒的方法要麼繼承thread類,要麼實現runnable介面。當然也可以使用執行緒池,但實現的本質都是差不多的。

這裡舉例:

下面**為伺服器的主線程。為每個客戶分配乙個工作執行緒:

public

void

service()catch

(exception e)}}

當然這裡的重點在於如何實現handler這個類。handler需要實現runnable介面:

class handler implements

runnable

public

void

run()

catch(exception e)finally

catch

(ioexception e)}}

}

當然是先多執行緒還有其它的方式,譬如執行緒池,或者jvm自帶的執行緒池都可以。這裡就不說明了。

轉阻塞socket和非阻塞socket

讀操作 對於阻塞的socket,當socket的接收緩衝區中沒有資料時,read呼叫會一直阻塞住,直到有資料到來才返 回。當socket緩衝區中的資料量小於期望讀取的資料量時,返回實際讀取的位元組數。當sockt的接收緩衝 區中的資料大於期望讀取的位元組數時,讀取期望讀取的位元組數,返回實際讀取的長...

專用socket位址和通用socket位址

socket位址api 協議族 位址族 描述 位址值含義和長度 pf unix af unix unix本地域協議族 檔案的路徑名,長度可達到108位元組 pf inet af inet tcp ipv4協議族 16bit埠號和32bit ipv4位址,共六個位元組 pf inett6 af ine...

Socket和ServerSocket學習筆記

對於即時類應用或者即時類的遊戲,http協議很多時候無法滿足於我們的需求。這會,socket對於我們來說就非常實用了。下面是本次學習的筆記。主要分異常型別 互動原理 socket serversocket 多執行緒這幾個方面闡述。異常型別 在了解socket的內容之前,先要了解一下涉及到的一些異常型...