網頁

2010年3月24日 星期三

Android Socket教學

Android是一隻網路功能強大的手機作業系統,網路的撰寫不算困難也很好玩
特別是連線對戰的遊戲,一群朋友一起拿著自己的手機和對方廝殺,這個畫面一定很有趣
今天先來解說一寫我在學習撰寫網路連線的時候遇到的一些困難和解決方法
介紹伺服端ServerSocket 物件
網路的連線一定要有一端當作主機(Server),一端當作客戶 (Client),Android裡將這兩種
連線方式分成兩種物件,分別是ServerSocket 和 Socket , 如果要開發主機端就使用ServerSocket物件, 開發客戶端就用Socket.

通常伺服端的撰寫流程都是 宣告ServerSocket物件->實體化並且傳入通訊Port->Accept等待連線->產生新的執行續,將Socket傳給新的執行續-> 回到Accept等待


ServerSocket主要功能就是聆聽Client的要求,並且產生新的socket和Clinet連線, ServerSocket的工作就告一段落,重新再度回到等待,至於和Clinet之前的傳送接收則是由新的新的執行續,和client去溝通。

宣告物件實體化如下
import java.net.ServerSocket;
public static final int SERVERPORT = 7777;
ServerSocket serverSocket = new ServerSocket(SERVERPORT);

會發這樣寫,於執行階段會產生一個權限問題,
Permission denied (maybe missing INTERNET permission)


只要在AndroidManifest.xml 裡設定新增 uses-permission 名字為 android.permission.INTERNET
或是於xml裡直接輸入


即可。

接下來
Accept等待連線->產生新的執行續,將Socket傳給新的執行續
Socket NewSocket = serverSocket.accept();

serverSocket.accept();會將程式阻塞,程式會停止在這裡不動,所以最好在使用serverSocket.accept()是一個不同於main的執行序,程式會一直等到有使用者者嘗試連線
程式才會繼續往下跑,並且產生一個NewSocket物件與 使用者進行互動連線

這時候如果還有其他使用者來要求連線,程式沒有辦法接受,要接受使用者要求連線必須讓程式
停在serverSocket.accept(); , 所以不建議accept之後就開始接收資料與回應資料,應立即產生新的執行序 並將NewSocket 交付出去,讓新的執行序執行傳送接收工作,並立刻回到serverSocket.accept();繼續等待連線,才可以服務多數使用者。

弄到這裡我們應該可以連線到android ,如果是實體手機是可以的,但如果是模擬器
需要如下動作

1.先啟動模擬器
2.再開啟 windows的CMD 執行 telnet 127.0.0.1 5554
5554代表模擬器的port
3.輸入
redir add tcp:7777:7777
打完之後 顯示ok表示成功。

這麼做的意思是,這台電腦接收到7777 port的資料請轉給 模擬器7777 裡面
例如再ie瀏覽器上 http://127.0.0.1:7777 使用debug就可以看到資訊已經送到模擬器裡



關於傳送接收,下回繼續。

沒有留言: