Socket套接字學習筆記
套接字Socket
1.IP與埠
IP
IP地址標識Internet上的計算機
(待補充)
埠
埠號標識正在計算機上執行的程序(程式)。
埠號被規定為一個16位的065535($2^{16}-1$)之間的整數,其中01023被預先定義的服務通訊佔用(如telnet佔用埠23、http佔用埠80等),除非需要訪問這些特定服務,否則應該使用1024~65535這些埠中的某一個進行通訊,以免發生埠衝突
2.什麼是Socket
當兩個程式需要通訊時,它們可以通過Socket類建立套接字物件並連線在一起(埠號與IP地址的組合得出一個網路套接字)
3.客戶端的套接字物件
Socket構造方法
Socket(String host, int port)
host是伺服器的IP地址,port是埠號
異常
建立套接字物件可能發生IOException異常,要處理好異常
try
{
Socket mysocket = new Socket("http://192.168.0.78",1880);
}
catch(IOException e){}
輸入輸出資訊
套接字建立後,可以想象一條通訊“線路”已經建立起來
我們可以用getInputStream()
獲得一個輸入流,然後用這個輸入流讀取伺服器放入“線路”的資訊(不能讀取自己放入線路的資訊)。
我們也可用getOutputStream()
獲得一個輸出流,然後用這個輸出流將資訊寫入“線路”。
後面把mysocket用方法getInputStream()
DataInputStream
流上,向這個流傳送資訊,因為這個流有更好的向流中寫入資訊的方法,getOutStream()
同理
4.ServerSocket類
為了使客戶成功連線至伺服器,伺服器必須建立一個ServerSocket物件,該物件將客戶端的套接字物件和服務端的一個套接字物件連線。
構造方法
ServerSocket(int port)
port是埠號,該埠號必須和客戶呼叫的埠號相同。(這裡埠可以理解為通道的編號?)
異常
建立ServerSocket物件時可能發生IOException異常
try { ServerSocket server_socket = new ServerSocket(1880); } catch(IOException e){}
accept方法
物件建立後,就可以用accept()方法將客戶端的套接字和伺服器端的套接字連線起來
try
{
Socket sc = server_socket.accept();
}
catch(IOException e){}
accept()
方法會返回一個和客戶端Socket物件相連線的Socket物件
伺服器端通過accept()
方法得到的這個物件sc使用方法getOutputStream()
獲得的輸出流將指向客戶端的mysocket使用方法getInputStream()
獲得的那個輸出流。
同樣,伺服器端的sc使用方法getInputStream()
獲得的輸出流將指向客戶端mysocket使用方法getOutputStream()```獲得的輸出流
因此,當伺服器向這個輸出流寫入資訊時,客戶端就能讀取,反之亦然。
注意accept()
方法會堵塞執行緒
accept()
方法會堵塞執行緒的繼續執行,直到接收到客戶的呼叫。
在下述程式碼中,如果沒有客戶呼叫伺服器,那麼下述程式碼中的System.out.println("ok")
就不會執行
try
{
Socket sc = server_socket.accept();
System.out.println("ok");
}
catch(IOException)
獲取IP
連線建立後,伺服器端的套接字物件呼叫getInetAddress()
方法可以獲取一個InetAddress物件,該物件含有客戶端的IP地址和域名
同樣,客戶端的套接字物件呼叫getInetAddress()
方法可以獲取一個InetAddress物件,該物件含有伺服器端的IP地址和域名
關閉套接字連線
通訊完畢後,應使用close()
方法關閉套接字連線
5.把套接字連線放在一個執行緒中
客戶使用Socket類不帶引數的構造方法Socket()
建立一個套接字物件,該物件呼叫
public void connect(SocketAddress endpoint) throws IOException
請求和引數SocketAddress
指定地址的套接字物件建立連線
為了使用connect
方法,可以使用SocketAddress
的子類InetSocketAddress
建立一個物件。InetSocketAddress
的構造方法如下:
public InetSocketAddress(InetAddress addr, int port)