Я могу создать сокетное соединение между простым TCP-клиентом на локальном хосте и простым TCP-сервером в приложении AVD Android.
AVD работает за виртуальным маршрутизатором, и для подключения к AVD мне нужно настроить переадресацию портов на виртуальном маршрутизаторе, что я делаю так:
adb -s emulator-5554forward tcp: 5000 tcp: 6000
Вот простая клиентская программа TCP, которая запускается на локальном хосте 127.0.0.1
и подключается к серверу AVD, который прослушивает порт 6000
public class SimpleTcpClient
{
public static void main(String argv[]) throws Exception
{
String host = "127.0.0.1";
//String host = "10.9.2.121";
int port = 5000;
String sentenceToServer = "hello server";
Socket clientSocket = new Socket(host, port);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
outToServer.writeBytes(sentenceToServer+"\n" );
String serverResponse = inFromServer.readLine();
clientSocket.close();
}
}
Вот метод инициализации сервера, на котором запущено приложение в эмуляторе Android, который прослушивает порт 6000
private void initTcpTestServer()
{
Log.d("TAG", "initTcpTestServer()");
try
{
String clientSentence;
ServerSocket welcomeSocket = new ServerSocket(6000);
welcomeSocket.setReuseAddress(true);
while ( true )
{
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(
new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
clientSentence = "hello client";
outToClient.writeBytes(clientSentence + "\n");
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
Если я запускаю SimpleTcpClient
на локальном хосте 127.0.0.1
, я могу создатьсокетное соединение.Но как только я пытаюсь запустить SimpleTcpClient
на другом компьютере, я получаю
Exception in thread "main" java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at java.net.Socket.connect(Socket.java:538)
at java.net.Socket.<init>(Socket.java:434)
at java.net.Socket.<init>(Socket.java:211)
at com.slacorp.eptt.android.testclient.SimpleTcpClient.main(SimpleTcpClient.java:22)
, единственное изменение, которое я делаю, это SimpleTcpClient - это изменение целевого IP-адреса с локального хоста 127.0.0.1
на 10.9.2.121
public class SimpleTcpClient
{
public static void main(String argv[]) throws Exception
{
//String host = "127.0.0.1";
String host = "10.9.2.121";
int port = 5000;
String sentenceToServer = "hello server";
System.out.println("initializing socket");
Socket clientSocket = new Socket(host, port);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
outToServer.writeBytes(sentenceToServer+"\n" );
String serverResponse = inFromServer.readLine();
clientSocket.close();
}
}
SimpleTcpClient
не будет подключаться к серверу на AVD, но если я заставлю сервер работать на 10.9.2.121
, так что сервер не находится на AVD за виртуальным маршрутизатором, сокетное соединение работает, поэтому я озадачен.
Как подключить удаленный TCP-клиент к AVD?