[英]Cannot get http server work on android
我有一個http服務器代碼(我嘗試過TJWS或NanoHTTPD),來自同一應用程序的客戶端將連接到端口8080或任何端口上運行的服務器。
我正在單獨的AsyncTask中啟動服務器對象,因此應該可以。
雖然NanoHTTPD完全無法從TJWS日志中看到其他啟動方式,但它表示類似:
server listening on 0.0.0.0/0.0.0.0 port:0 localport:8080
這意味着服務器成功啟動,第一個問題是0.0.0.0綁定地址可接受嗎? 我的意思是應該改為127.0.0.1? 抱歉,如果這是一個菜鳥問題。
當我使用adb shell連接到仿真器並運行netstat時,可以看到以下幾行
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:5037 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:5555 0.0.0.0:* LISTEN
tcp 0 0 10.0.2.15:5555 10.0.2.2:52132 ESTABLISHED
tcp6 0 0 :::8080 :::* LISTEN
通過谷歌搜索,我了解到0 ::: 8080意味着服務器正在ipv6和ipv4上監聽,這沒關系。
但是當我嘗試訪問它的客戶端代碼時,它繼續等待永恆。
我的httpClient代碼
try {
URL url = new URL("http://0.0.0.0:"+8080+"/media");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
while((line = br.readLine()) != null){
Log.d("server", line);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
對於服務器,地址0.0.0.0就像一個通配符,意味着它正在偵聽設備擁有的所有IP地址。
對於客戶端,您需要使用真實的IP地址,例如127.0.0.1
經過一點調試之后,我發現問題不是客戶端打開連接的地方,而是服務器啟動的地方,它從未返回onPostExecute()方法,而是在將服務器啟動代碼包裝在Runnable中之后
new Thread(new Runnable() {
@Override
public void run() {
Log.d("server", "server starting on port: " + port);
srv.serve();
}
}).start();
有用!!
服務器是一個無限循環,是否必須從線程內部啟動? 我以為AsyncTask可以處理?
還值得一提的是,客戶端連接也必須包裝在AsyncTask中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.