背景Javaサーバー用のAndroidクライアントアプリケーションを作成し、TCPソケットを使用して通信させようとしています。
Androidデバイスエミュレーターで実行すると、アプリは機能します
携帯電話でアプリを実行すると何が機能しないのか、ソケットの作成時に接続タイムアウトが発生します。
例外java.net.ConnectException:/10.0.2.2(ポート9111)への接続に失敗しました:接続に失敗しました:ETIMEDOUT(接続がタイムアウトしました)
サーバーとモバイルデバイスが同じwifiネットワークに接続されており、ラップトップ(サーバーを実行している場所)のファイアウォールをオフにしました
これの原因は何でしょうか?、助けてくれてありがとう
サーバ
public class HelpMeServer {
public final static int port=9111;
public static void main(String[] args) throws IOException {
Database db=new Database();
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port);
System.out.println("Listening on port "+port);
} catch (IOException e) {
System.err.println("Could not listen on port: "+port);
System.exit(1);
}
while(true)
{
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
ClientThread t=new ClientThread(clientSocket,db);
t.start();
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}
}
}
}
主な活動
public class LoginActivity extends Activity {
private EditText view_email;
private EditText view_password;
TextView result;
ConnectionHandler conhandler;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
view_email=(EditText) findViewById(R.id.email);
view_password=(EditText) findViewById(R.id.password);
result=(TextView) findViewById(R.id.result);
}
public void login(View view)
{
String email=view_email.getText().toString();
String password=view_password.getText().toString();
ConnectionHandler c=new ConnectionHandler();
c.execute(new String[]{"login",email,password});
try {
String response=c.get();
if(response.equals("login successful"))
{
Intent i=new Intent(this,MainActivity.class);
startActivity(i);
}
result.setText(response);
} catch (InterruptedException e) {
result.setText("err");
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
result.setText("err");
}
}
}
ソケットを開始する非同期アクティビティ
public class ConnectionHandler extends AsyncTask<String, Void, String>{
public static final String serverip = "10.0.2.2";
public static final int serverport = 9111;
Socket s;
PrintWriter out;
BufferedReader in;
@Override
protected String doInBackground(String... lines)
{
Log.i("AsyncTank", "doInBackgoung: Creating Socket");
try {
s = new Socket(serverip, serverport);
Log.i("AsyncTank", "doInBackgoung: Created Socket");
} catch (Exception e) {
Log.i("AsyncTank", "doInBackgoung: Cannot create Socket "+e.toString());
}
if (s.isConnected()) {
try {
in = new BufferedReader(new InputStreamReader(s.getInputStream()));
out = new PrintWriter(s.getOutputStream(), true);
Log.i("AsyncTank", "doInBackgoung: Socket created, Streams assigned");
} catch (IOException e) {
// TODO Auto-generated catch block
Log.i("AsyncTank", "doInBackgoung: Cannot assign Streams, Socket not connected");
e.printStackTrace();
}
} else {
Log.i("AsyncTank", "doInBackgoung: Cannot assign Streams, Socket is closed");
}
for (String line:lines)
{
writeToStream(line);
}
String result=readFromStream();
return result;
}