歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android使用socket與本地PC進行通信的問題

Android使用socket與本地PC進行通信的問題

日期:2017/3/1 10:27:39   编辑:Linux編程

1.自己首先建立個java project.用它做為服務器端的程序,代碼如下:

package com.server;

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Myserver {
public static void main(String[] args) {
try {
ServerSocket server=new ServerSocket(5000);
while(true){
Socket client=server.accept();
OutputStream out=client.getOutputStream();
String msg="Hello Android";
out.write(msg.getBytes());
client.close();

}
} catch (IOException e) {

e.printStackTrace();
}
}

}

2.建立android客戶端程序,代碼如下:

package com.android;

import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class SocketTestActivity extends Activity {
private TextView myTextView;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myTextView=(TextView)findViewById(R.id.msgTextView01);
myTextView.setText("dd");
try {

Socket socket=new Socket("127.0.0.1",5000);
myTextView.setText("ff");
InputStream in=socket.getInputStream();
byte[]buffer=new byte[in.available()];
in.read(buffer);
String msg=new String(buffer);
System.out.println(msg);
} catch (UnknownHostException e) {

e.printStackTrace();
} catch (IOException e) {
myTextView.setText("ee");
e.printStackTrace();
}
}
}

3.然後運行java project中的程序,查看端口,已經等待監聽。

4.運行android應用程序在客戶端,報錯,無法建立socket連接,錯誤信息是java.net.PlainSocketImpl.connect,這說明沒有連接成功,因為IP地址或端口號錯誤。

花了好長時間在網上查看原因,有說把ip:127.0.0.1改成10.0.2.0的,結果不行,10.0.2.2是模擬器的IP,相當於本地的127.0.0.1.是android的路由器給每個模擬器分配的IP地址。

有進入cmd,輸入ipconfig,直接使用裡面的IP的,也不行的。

後來進行端口的映射,使用命令telnet localhost 5554,

diret tcp:5000:6000,也不行,後來發現這是在兩天模擬器上進行請求轉發是需要配置的信息,不能完成模擬器和PC的通信的。

最後嘗試將端口號寫成模擬器的端口號,我5554或5556,還是不行的。

這都要害死我了。

這才是王道,這才是正解:

在android的官方網站上是這麼寫的:本地網絡連接受限。每個模擬器運行在後台的虛擬路由上,模擬器不能接入物理路由器。於模擬器交互信息可能被本地的防火牆阻塞,或者被你連接的防火牆阻塞。也就是說兩個模擬器直接可以通過請求轉發實現通信,模擬器和PC不能通信。

我的解決方法:用真機進行測試,通過了。沒有真機的,那就沒辦法了。希望那些還沒解決的人不要浪費時間了。期待Google能快點解決這個問題。

Copyright © Linux教程網 All Rights Reserved