Я пытаюсь установить клиент-серверные отношения между устройством Android (эмулятором) и моим ноутбуком. Похоже, что сокет настроен правильно, так как данные сначала передаются от клиента к серверу, но программа зависает на стороне клиента при попытке использовать ObjectInputStream для установления входного потока.
Вот код, используемый для настройки сервера на ноутбуке:
try{
providerSocket = new ServerSocket(6666);
connection = providerSocket.accept();
out = new ObjectOutputStream(connection.getOutputStream());
out.flush();
System.out.println("output stream established");
in = new ObjectInputStream(connection.getInputStream());
System.out.println("input stream established");
try{
message = (String)in.readObject();
System.out.println("client>" + message);
sendMessage("Thanks for the message!");
}
catch(ClassNotFoundException classnot){
System.err.println("Data received in unknown format");
}
}
catch(IOException ioException){
ioException.printStackTrace();
}
Вот соответствующий код для устройства Android. Метод updatePhotos вызывается, когда нажимается определенная кнопка, вы можете видеть, что текст кнопки изменяется, чтобы помочь определить, где останавливается код.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new ClientThread()).start();
}
public void updatePhotos(View view){
Button button = (Button)findViewById(R.id.button7);
try {
String msg = "Hello";
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
out.flush();
out.writeObject(msg);
out.flush();
button.setText("Establishing Input Stream");
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
button.setText("Input stream established");
msg = (String)in.readObject();
button.setText(msg);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
class ClientThread implements Runnable {
@Override
public void run() {
try {
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVERPORT);
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
Таким образом, сначала запускается серверная программа, а затем приложение Android запускается на эмуляторе. ClientThread запускается, когда начинается первая активность приложения и успешно устанавливается подключение к сокету.
Затем я нажимаю кнопку, и программы запускаются до тех пор, пока текст кнопки не будет читать «Установка входного потока», а консоль Eclipse не будет читать:
выходной поток установлен
входной поток установлен
клиент>Здравствуйте
сервер>Спасибо за сообщение!
Ясно, что программа останавливается на строке, которая создает ObjectInputStream для клиента, хотя данные отправляются клиенту с сервера. Сообщений об ошибках нигде нет. Что я здесь делаю неправильно?