Socket機(jī)制用到的類有java.net.ServerSocket、java.net.Socket等。服務(wù)器端以監(jiān)聽端口號和接受隊(duì)列長度為參數(shù)實(shí)例化ServerSocket類,缺省的隊(duì)列長度是50,以accept()方法接收客戶的連接。客戶端則直接以服務(wù)器的地址和監(jiān)聽端口為參數(shù)實(shí)例化Socket類,連接服務(wù)器,缺省的連接方式是stream socket(區(qū)別于datagram socket)。
    服務(wù)器端和客戶端調(diào)用getInputStream()和getOutputStream()方法得到輸入/輸出流。如果以O(shè)bjectInputStream和ObjectOutputStream包裝Socket的輸入/輸出流,要注意一點(diǎn),ObjectOutputStream類實(shí)例化時要向底層流寫入一個標(biāo)識碼,ObjectInputStream類相應(yīng)的讀入該標(biāo)識碼,如果實(shí)例化的次序不當(dāng)會引起死鎖。建議客戶服務(wù)器兩端都先實(shí)例化ObjectOutputStream。
    因?yàn)檎{(diào)用ServerSocket類的accept()方法和Socket輸入流的read()方法時會引起線程阻塞,所以應(yīng)該用setSoTimeout()方法設(shè)置超時,缺省的設(shè)置是0,即超時永遠(yuǎn)不會發(fā)生。超時的判斷是累計(jì)式的,一次設(shè)置后,每次調(diào)用引起的阻塞時間都從該值中扣除,直至另一次超時設(shè)置或有超時異常拋出。比如,某種服務(wù)需要三次調(diào)用read(),超時設(shè)置為1分鐘,那么如果某次服務(wù)三次read()調(diào)用的總時間超過1分鐘就會有異常拋出,如果要在同一個Socket上反復(fù)進(jìn)行這種服務(wù),就要在每次服務(wù)之前設(shè)置一次超時。