Android開發Socket編程

來源:互聯網
上載者:User

一.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的方法:
        SocketInetAddress remoteAddress,intremotePort)
        利用Socket建構函式,可建立一個TCP通訊端後,先串連到指定的遠程地址和連接埠號碼。
        SocketInetAddress address,int port ,InetAddress localAddr ,intlocalPort)
        Socket(InetAddress address, int port ,booleanstream)
        SocketSocketImpl 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等。

編輯精選】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.