原文地址:http://www.cnblogs.com/kross/p/3621952.html
考慮到以後可能要用到這方面的知識,就來寫個Demo嘗試下,其實以前學過,但不記得了……(用不到的東西各種不記得啊)
直接進入正題吧,在Android上使用Socket實際上跟在Java中使用差不多,只要注意下在Manifest中加網路許可權就好了(我原來經常犯這個錯誤),另外網路請求不能再主線程裡,基本就OK了。
そして,先寫一個伺服器的小程式吧。就直接使用Java寫就好了,灰常的簡單,隨便寫寫。
main(String[] args) = ServerSocket(5417= ("waiting for..."== BufferedReader(
然後我的構想是,手機上有一個輸入框,一個按鈕,使用者可以按按鈕,把輸入框裡的內容發送到伺服器上。一開始我寫了一個很混亂的demo,為了更加方便使用,就把Socket的封裝了一下,就叫SocketManager吧,代碼如下:
Socket client = String ip = "113.251.172.30" port = 5417 SocketManager newInstance() SocketManager() = sendMessage(String msg) =
幾個要點:
1.IP地址就寫Java程式鎖啟動並執行機器的公網地址,cmd->ipconfig就可以查到。
2.連接埠號碼請和伺服器那個保持一致,都不在一個管道裡怎麼通訊哇。
3.我使用了靜態Factory 方法,每次都要重新new一個SocketManager,因為我發現Socket這個類只能用一次,close之後再發送便沒用了。
4.伺服器要收到資訊,必須要用戶端的東西close了,輸出資料流close也好,socket.close也好,總之要close,伺服器才能確切的收到。
然後,我寫了一個線程來執行這個Socket,因為不能在主線程跑嘛,我想了很久,可不可以讓這個線程一直執行著,然後只要調用下這個線程的sendMessage方法,就可以發送了,這樣就只需要new一個線程就行了,但是我想了好久,都想不通,貌似不能那樣,線程要麼沒有,有的話就會一股腦的執行它的run()方法,想要長時間持有它?在run裡面加個while(true)?那怎麼做到調用它的共有方法呢?總之,我沒有想到用只需要new一個線程就可以發N個請求的辦法,貌似需要使用到Service來實現了。
SocketThread =
這裡倒沒什麼好說的。接下來我們就直接在MainActivity裡面準備好控制項,監聽器,然後就OK了,大致的看下代碼吧。
MainActivity EditText etInput = Button bSend = "MainActivity"== SendButtonListener = Thread(""
OK,代碼就是這樣了,來看下最終的運行效果吧。
先啟動Java的伺服器程式,啟動後結果是這樣的:
然後我們運行手機上的程式,發送一條訊息:
再來看伺服器端的程式:
看上去一切正常,再來一發!
再看看伺服器的程式:
OK,看來是沒有問題了。
伺服器如何向Socket返回資訊暫時還沒有去實驗,留著明天來搞吧……
原文地址:http://www.cnblogs.com/kross/p/3621952.html
新浪微博:http://weibo.com/KrossFord