android中的scoket

一.Socket簡介

1.所謂Socket通常也稱作“套接字”,用於描述IP地址和端口,是一個通信鏈的句柄
2.應用程序通常通過“套接字”向網絡發送請求或者應答網絡請求
3.Socket有兩種主要的操作方式:面向連接(TCP)的和無連接的(UDP)。
4.Java.net中提供了兩個類Socket和ServerSocket,分別用來表示雙向連接的客戶端和服務端。
一個客戶端要發起一次通信,首先必須知道運行服務器端的主機IP地址。然後由網絡基礎設施利用目標地址,將客戶端發送的信息傳遞到正確的主機上,在 Java中,地址可以由一個字符; 串來定 義,這個字符串可以使數字型的地址(比如192.168.1.1),也可以是主機名(example.com)。在 Java中InetAddress類代表了一個網絡目標地址,包括主機名和數字類型的地址信息。

二.使用基於TCP協議的Socket

1.ServerSocket:
ServerSocket:這個類是實現了一個服務器端的Socket,利用這個類可以監聽來自網絡的請求。
(a)創建ServerSocket的方法:
ServerSocket(IntlocalPort)
ServerSocket(int localport,intqueueLimit)
ServerSocket(int localport,intqueueLimit,InetAddress localAddr)
創建一個ServerSocket必須指定一個端口,以便客戶端能夠向該端口號發送連接請求。端口的有效範圍是0-65535(0-1023是系統預留的,最好大於1024)
0~1023的端口號爲系統所保留,例如http服務的端口號是80,telnet服務的端口號爲21,ftp爲23。所以我們在選擇端口號時最好選擇大 於1023的數,防止發生衝突。在創建 Socket時,如果發生錯誤,將產生IOException,在程序中必須對其進行處理。所以在創建Socket 或ServerSocket時必須捕獲或拋出異常。
    (b)ServerSocket操作
        (1)
Socketaccept()
                       accept()方法爲下一個傳入的連接請求創建Socket實例,並將已成功連接的Socket實例返回給服務器套接字,如果沒有連接請求,accept()方法將阻塞等待;
        (2)void close
                       close方法用於關閉套接字

2.Socket
   (a)創建Socket的方法:

        Socket(InetAddress remoteAddress,intremotePort)
        利用Socket構造函數,可創建一個TCP套接字後,先連接到指定的遠程地址和端口號。
        Socket(InetAddress address,int port ,InetAddress localAddr ,intlocalPort)
        Socket(InetAddress address, int port ,booleanstream)
        Socket(SocketImpl impl)
        address、host、port分別表示雙向連接中另一方的IP地址、主機名、端口號
        stream指明Socket是流Socket還是數據報Socket
        localAddr,bindAddr是本地機器的地址(ServerSocket的主機地址)
        impl是Socket的父類,既可以創建ServerSocket,也可創建Socket
  (b)操作Socket的方法
         通信過程中順序:服務器端首先得到輸入流,然後將輸入流信息輸出到其各個客戶端
         Socket提供了getInputStream()和getOutputStream()方法來得到輸入輸出流。然後再對輸入流輸出流進行讀寫操作,例 如,對於服務器端,得到Socket對象後,調用getInputStream方法即  可得到來自客戶端的流,調用getOutStream方法可得到向客 戶端發送數據的流。對於客戶端,調用getInputStream方法即可得到來自服務器的流,調用getOutStream方法可得到向服務器端發送  數 據的流。
         InputStreamgetInputStream()
         OutputStreamgetOutputStream()
         可調用Socket的close()方法進行關閉,在關閉前,應將與Socket相關的所有輸入輸出流關閉,正着打開,倒着關閉。

3.編程步驟:
       創建服務器的步驟:
       指定端口實例化一個ServerSocket調用ServerSocket的accept方法以在等待連接期間造成阻塞獲取位於該底層Socket的流以進行讀寫操作將數據封裝成流對Socket進行讀寫關閉打開的流
       創建客戶端的步驟:
       通過IP地址和端口實例化Socket,請求連接服務器獲取Socket上的流以進行讀寫把流包裝進BufferedReader/PrintWriter的實例對Socket進行讀寫關閉打開的流

       當要監控多個客戶端時,可使用類ExecutorService
       其對象獲取方法:Executors.newCachedThreadPool();
       調用該對象的execute(Runnablecommand)即可,在未來某個時間執行給定的命令。該命令可能在新的線程、已入池的線程或者正調用的線程中執行,這由Executor實現決定

三.使用基於UDP的Socket

(a)創建DatagramSocket
               DatagramSocket(byte [] data,intoffset,int length,InetAddress remoteAddr,intremotePort)
               該構造函數創建一個數據報文對象,數據包含在第一個參數data當中
               Offset是指偏移量長度,length是指數據包長度。
       (b)創建DatagramSocket
               DatagramSocket(intlocalPort)
               以上構造函數將創建一個UDP套接字;
       (c)DatagramSocket:發送和接受
               void send(DatagramPacketpacket)
               void receive(DatagramPacketpacket)
               send()方法用來發送DatagramPacket實例。一旦創建連接,數據報將發送到該套接字所連接的地址;
               receive()方法將阻塞等待,知道接收到數據報文,並將報文中的數據複製到指定的DatagramPacket實例中。

補充:

           對AndroidManifest.xml的配置一定不要忘了:
           <uses-permissionandroid:name="android.permission.INTERNET"/>

            輸入和輸出流要用DataOutputStream和DataOutputStream,不可以用PrintWriter、StreamReader等。


發佈了20 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章