Я создаю и тестирую простой TCP-сервер на эмуляторе Android.
Я использую простую клиентскую программу Java, чтобы попытаться подключиться к серверу, работающему на эмуляторе. Я пытаюсь отправить простую строку типа «Привет, мир».
Я думаю, что соединение между клиентом и сервером успешно инициализировано; однако данные не направляются на устройство Android.
Серверный поток блокируется в строке clientSentence = inFromClient.readLine();
, а клиентский поток блокируется в String serverResponse = inFromServer.readLine();
.
У меня есть перенаправленный порт локального хоста 6100
на виртуальный порт AVD 7100
согласно Google документы с ADB
adb -s emulator-5554 forward tcp:6100 tcp:7100
Вот класс Java TCPTestClient
public class TCPTestClient
{
public static void main(String argv[]) throws Exception
{
String sentenceToServer = "hello server";
System.out.println("initializing socket");
Socket clientSocket = new Socket("127.0.0.1", 6100);
System.out.println("socket initialized");
System.out.println("getting output stream to server");
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
System.out.println("found output stream to server");
System.out.println("getting input stream from server");
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
System.out.println("found input stream from server");
System.out.println("writing sentence to server");
outToServer.writeBytes(sentenceToServer );
System.out.println("sentence written");
System.out.println("waiting for sentence response from server");
String serverResponse = inFromServer.readLine();
System.out.println("serverResponse = "+serverResponse);
System.out.println("socket closed");
clientSocket.close();
}
}
Вот метод приложения для Android initTcpTestServer()
private void initTcpTestServer()
{
Log.d("TAG", "initTcpTestServer()");
try
{
String clientSentence;
ServerSocket welcomeSocket = new ServerSocket(7100);
while ( true )
{
Log.d("TAG", "looking for socket");
Socket connectionSocket = welcomeSocket.accept();
Log.d("TAG", "socket accepted");
Log.d("TAG", "getting input stream");
BufferedReader inFromClient = new BufferedReader(
new InputStreamReader(connectionSocket.getInputStream()));
Log.d("TAG", "input stream found");
Log.d("TAG", "getting output stream");
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
Log.d("TAG", "output stream found");
Log.d("TAG", "reading input stream");
clientSentence = inFromClient.readLine();
Log.d("TAG", "input stream read");
Log.d("TAG", "input = " + clientSentence);
Log.d("TAG", "writing output back to client");
outToClient.writeBytes(clientSentence);
Log.d("TAG", "output written back to client");
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
Если я сначала инициализирую сервер TCP, я получаю вывод
initTcpTestServer()
looking for socket
После инициализации TCP-сервера, а затем инициализации TCP-клиента, я получаю с сервера
getting input stream
input stream found
getting output stream
output stream found
reading input stream
и от клиента
initializing socket
socket initialized
getting output stream to server
found output stream to server
getting input stream from server
found input stream from server
writing sentence to server
sentence written
waiting for sentence response from server
так что похоже, что сокет установлен, но сервер блокируется в строке
clientSentence = inFromClient.readLine();
и клиентские блоки на
String serverResponse = inFromServer.readLine();
, потому что клиент записал данные, но сервер так и не получил их, и клиент зависает в ожидании ответа сервера.