1. 程式人生 > 其它 >Socket套接字學習筆記

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)