ANDROID SOCKET 開發

來源:互聯網
上載者:User

標籤:android   blog   http   io   os   使用   sp   java   on   

轉載於zeta的文章(http://blog.sina.com.cn/s/blog_685790700100xjuo.html)

 

最近在研究Android應用軟體的開發,之前做了7、8年的C#,對Java並不熟悉,不過還好能夠看得懂一些!

 

根據之前的經驗,應用軟體的網路通訊無非就是Socket和HTTP,其中Socket又可以用TCP和UDP,HTTP的話就衍生出很多方式,基礎的HTTP GET和POST請求,然後就是WebService的SOAP。

 

在這些方式中,Socket當然是最基礎的。因此先從Socket開始。

 

服務端就不需要過多的說明了,無論採用什麼語言什麼平台都可以,只要遵循基本的Socket監聽模式就行。

 

實際上Android的Socket開發就是Java的Socket開發,因此學習過Java的開發人員也許覺得並沒有什麼難度,不過依然有一些不同於PC開發的地方需要注意

 

首先是說說TCP開發

 

JAVA裡的TCP開發感覺比C#裡簡單多了,實現方法幾句話就能完成。

 

    Socket socket = new Socket("192.168.3.119",7628);//建立Socket執行個體,並綁定串連遠端IP地址和連接埠
   
    OutputStream ops = socket.getOutputStream();//定義一個輸出資料流,來自於Socket輸出資料流
      
    byte[] bytes = b.getBytes();
           
    ops.write(bytes);//向輸出資料流中寫入資料
    
    ops.flush();//刷行輸出資料流

    //至此,在串連成功的情況下,服務端應該就能收到發送過去的流了。
    

    //接下來是接收伺服器發送過來的資料
    InputStream ips = socket.getInputStream();//定義輸入資料流,來自於socket的輸入資料流
    
    byte[] bytes2 = new byte[20];
    
    ips.read(bytes2);//讀取輸入資料流資料
      
    String str = new String(bytes2);//轉換成字串

    btn.setText(str);//顯示出來(我是現實在button上,當然,這個方法不正規,不過可以讓我少放點空間,看上去介面乾淨點,只要能看到效果就行)
    
    socket.close();

 

 

服務端代碼就不多說明了,只要實現了Socket監聽和接收,發送就行。這樣Android上Tcp的Socket就完成了,很簡單。

 

接下來是UDP的,理論上來說,UDP的實現應該更簡單,不過,由於使用模擬器來調試的關係,出了一點小問題,鬱悶了很久,另外,Java用UDP Socket對應使用的類是DatagramSocket,與C#不同,c#是在建立Socket的時候制定參數來制定協議類型,先看代碼。

 

    DatagramSocket dgs = new DatagramSocket();//建立一個Socket,這個Socket將作為一個發送器,將Socket包發送出去
    
    InetAddress inet = InetAddress.getByName("192.168.3.119");//建立一個InetAddress,ip地址為要發動到的遠端的伺服器IP
    
    DatagramPacket dgp = new DatagramPacket("test2".getBytes(), "test2".getBytes().length,inet,7628);//建立一個UDP資料包,資料包包含遠端的IP地址及連接埠
    
    dgs.send(dgp);//發送    
   
    dgs.close();
    
    
    DatagramSocket dgs2 = new DatagramSocket(9997);//建立另一個UDPSocket,
    
    DatagramPacket dgp2 = new DatagramPacket(new byte[20],20); //建立一個空報文包
    dgs2.receive(dgp2);//接收資料並填充到報文包中
    
    String str = new String(dgp2.getData());//擷取報文包裡的資料並轉換成字串
    
    btn.setText(str);//顯示獲得的資料
    
    dgs2.close();//關閉Socket

 

需要特別注意的地方,在不做連接埠映射的情況下,UDP可能無法接受到伺服器端發送過來的資料,原因是使用eclipse開發的時候,偵錯工具是用的類比環境,類比環境下,接收資料是要做連接埠映射的,因為類比環境下,沒有自己真實的IP地址和連接埠,模擬器是使用5554來啟動並執行,發送資料到PC沒問題,但是PC發送到模擬器的時候,需要把原生連接埠映射到模擬器上,真機環境不需要,具體操作方式如下

 

1、運行模擬器
2、開啟DOS命令列視窗
    執行:telnet localhost 5554
   5554是模擬器的連接埠,執行之後會進入android console
3、 在console下執行:
   redir add udp :8000:9000
   其中,第一個連接埠號碼是PC的連接埠,第二個連接埠號碼是模擬器連接埠。
   執行此命令之後,會把PC 8000連接埠接收到的資料轉到模擬器的9000連接埠,模擬器就能從9000連接埠接收UDP資料包了

 

另外,要實現Socket,必須在 AndroidManifest.xml 中加入許可權如下

<uses-permission android:name="android.permission.INTERNET" />

ANDROID SOCKET 開發

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.