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