android與PC直連的socket問題


關鍵字:abdroid 模擬器 socket

突然有人說使用android的模擬器做socket服務器,PC做客戶端,使用UDP通信的時候,android端無法收到數據包。反過來沒問題,我覺得這怎么可能,首先如果你代碼沒問題的話,那就只有真實IP和端口有問題了。於是我搜索了一下,網上還真不少人問這個問題,我不得不說現在java程序員都被SSH毀了,很多已經到了不去思考的地步了,遇到問題想都不想一問,原來你也這樣?既然大家都這樣,那就說明無法解決了……….
特別是對java來說開源庫各種各樣,很多人已經養成了不去思考和嘗試的習慣,直接找現有的實現了。這樣就完全沒有編程的樂趣了,哎,好了回到本文要點吧。首先對於TCP/UDP通信來說至少要有一定的知識。
首先在不考慮TCP/UDP的具體協議和實現方式、網絡設備和OSI各種協議的前提下至少要明白java的SOCKET框架,當然SOCKET對於各種語言來說道理是完全一樣的,只是底層實現不同而已,到了java連socket的實現也不需要管了,只要知道類庫怎么用就可以。
socket通信至少需要兩個前提,對方的IP和端口。這也是基要求,所以出問題了在排除代碼問題之后只能是出現在這里了,當然還有就是你網絡的物理結構沒問題。然后是本文的使用范圍,本文的范圍是PC和android模擬器或者使用USB方式與真實android進行socket通信。如果android連接上路由設備,與PC處於同等地位,對外有獨立IP的情況下,比如WIFI。自然不在本文討論范圍,這時候你查看兩個設備的IP然后指定端口連接就是了。
在此需要另外說明android設備的IP策略問題。當android設備與PC相連的的情況下,會默認PC的IP為10.0.2.2,自身的IP為10.0.2.15/127.0.1。也就是說android設備連接IP10.0.2.2就可以達到連接PC的效果,但是反過來,PC無法知道android的IP地址所以你無法使用某個默認值來主動向android設備發出連接請求。在想到這點時基本就明白接下來要怎么做了。
首先是TCP情況下,TCP是有連接狀態的,所以任何一段連接建立成功就可以通信。使用TCP/SOCKET連接android設備的場景很多,比如,在android設備中有一個自己的apk做socket服務器,然后再PC端的程序需要與其建立連接然后獲取android設備的詳細情況。這時候一般是用adb forward 將本機 TCP端口轉發到android設備的TCP端口,這樣在PC端就可以無需知道android設備的IP直接向本機,如127.0.0.1的某個端口發送數據包,之后端口轉發機制會將其轉發到android設備。這個不多說,沒什么意思。
接下來是UDP,之所以着重說UDP,是因為UDP非常特殊。好在這里是與PC直連,但是adb forward不能轉發UDP端口信息,只能是TCP…. 好吧,也正因為如此我發現了轉發端口的基本命令redir。
redir add < udp/tcp >:< pc端口 >:< 模擬器端口 >,如redir add udp:1096:1097 redir tcp:1096:1097,作用就是將PC的1096端口轉發到android設備的1097端口,當然兩個端口號可以相同,因為他們是在兩個不同的設備上。但是有個缺點,就是不如adb forward靈活。操作過程如下:

如上圖,PC端使用telnet命令連接到android設備,telnet需要的IP就是本機,端口可以使用adb devices命令查看,連接成功之后可以使用redir命令,有list、add、del幾個參數,list如圖就是列出存在的轉發關系,add添加,del就是刪除了,詳細說明參考文檔這里不必多說。設置轉發成功之后就有一個從PC看是1098的通信端口,從android'設備看是1097通信端口的直連通道。接下來上代碼。

上圖左側為android代碼,實現一個UDP/SOCKET的服務端,監聽本地1097端口。右側為PC端java代碼直接向本機1098端口發送UDP數據包。兩側分別啟動,在轉發關系建立之前,android是不會受到UDP數據包。一旦轉發關系1098:1097建立之后UDP服務端就會收到PC端的消息。

如上圖所示,右側控制台為PC端socket發送內容,左側logcat為android設備中的socket服務器收到的內容。當然反過來,可以不需要轉發直接向PC端發送消息。
以上。
ps,本人在實現過程中,用android模擬器向PC主廣播數據包時,PC接收不到,不知道各位有沒有遇到這種情況,求解答!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM