綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[經驗] Android Socket 開發

[複製連結] 查看: 3024|回覆: 1|好評: 1
跳轉到指定樓層
樓主
暗桌之光 | 收聽TA | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
發表於 2013-8-14 14:47

馬上加入Android 台灣中文網,立即免費下載應用遊戲。

您需要 登錄 才可以下載或查看,沒有帳號?註冊

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

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

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

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

首先是說說TCP開發

JAVA裡的TCP開發感覺比C#裡簡單多了,實現方法幾句話就能完成。
  1. Socket socket = new Socket("192.168.3.119",7628);//建立Socket實例,並連結連接遠端IP地址和端口

  2. OutputStream ops = socket.getOutputStream();//定義一個輸出流,來自於Socket輸出流
  3.   
  4. byte[] bytes = b.getBytes();
  5.       
  6. ops.write(bytes);//向輸出流中寫入資料

  7. ops.flush();//刷行輸出流

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


  9. //接下來是接收服務器傳送過來的資料
  10. InputStream ips = socket.getInputStream();//定義輸入流,來自於socket的輸入流

  11. byte[] bytes2 = new byte[20];

  12. ips.read(bytes2);//讀取輸入流資料
  13.   
  14. String str = new String(bytes2);//轉換成字符串

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

  16. socket.close();
複製代碼
服務端代碼就不多說明了,只要實現了Socket監聽和接收,傳送就行。這樣Android上Tcp的Socket就完成了,很簡單。

接下來是UDP的,理論上來說,UDP的實現應該更簡單,不過,由於使用模擬器來調試的關係,出了一點小問題,鬱悶了很久,另外,Java用UDP Socket對應使用的類是DatagramSocket,與C#不同,c#是在建立Socket的時候制定參數來制定協議類型,先看代碼。
  1. DatagramSocket dgs = new DatagramSocket();//建立一個Socket,這個Socket將作為一個傳送器,將Socket包傳送出去
  2.    
  3. InetAddress inet = InetAddress.getByName("192.168.3.119");//建立一個InetAddress,ip地址為要發動到的遠端的服務器IP
  4.    
  5. DatagramPacket dgp = new DatagramPacket("test2".getBytes(), "test2".getBytes().length,inet,7628);//建立一個UDP資料包,資料包包含遠端的IP地址及端口
  6.    
  7. dgs.send(dgp);//傳送   
  8.    
  9. dgs.close();
  10.    
  11.    
  12. DatagramSocket dgs2 = new DatagramSocket(9997);//建立另一個UDPSocket,
  13.    
  14. DatagramPacket dgp2 = new DatagramPacket(new byte[20],20); //建立一個空報文包
  15. dgs2.receive(dgp2);//接收資料並填充到報文包中
  16.    
  17. String str = new String(dgp2.getData());//獲取報文包裡的資料並轉換成字符串
  18.    
  19. btn.setText(str);//顯示獲得的資料
  20.    
  21. 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 中加入權限如下
  1. <uses-permission android:name="android.permission.INTERNET" />
複製代碼
「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)

評分

參與人數 2碎鑽 +1 幫助 +2 收起 理由
mi56ch56 + 1 + 1 非常讃
milo + 1

查看全部評分

收藏收藏1 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆

使用道具 舉報

沙發
zue | 收聽TA | 只看該作者
發表於 2013-8-17 00:25
在這行中>>byte[] bytes = b.getBytes();
的b的資料型態會影響傳送的結果嗎?
假設b是String,那麼在服務端需要做甚麼轉換嗎?

------------------------------------------------------------------------------
小弟最近遇到一個問題,我用delphi程式當作服務端,android為客戶端,連線時確定可以連線(可以取到客戶端的ip),不過字串卻怎麼也取不出來,這可能是甚麼原因造成的?
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則