Как получить строку из DataInputStream в Java?
Я работаю над приложением, состоящим из сокетов. Необходимо передать значение String с клиента (устройства Android) на сервер (на моем компьютере работает Ubuntu). В коде на стороне сервера мне нужно сохранить значение, передаваемое через сокет, в строковую переменную.
Вот код, который я использую для отправки значения String на сервер.
//instantiating the socket object for the client
Socket client = new Socket("192.168.0.103", port);
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
String msg = "My String Value";
//Message to be send to server
out.writeUTF(msg);
//Closing the client's socket. No connections after this.
client.close();
И вот код, который я использую, чтобы получить значение String на сервере.
//Server object. Stores the reference to the socket object returned by the accept()
//The returned socket object contains established connection to the client.
Socket server = serverSocket.accept();
DataInputStream in = new DataInputStream(server.getInputStream());
System.out.println(in.readUTF());
//This prints "My String Message"
//Something like this i want to do.
String msg = in.readUTF();
//closing the server socket. No connection now.
server.close();
Сейчас происходит то, что программа на стороне сервера застревает в строке:
String msg = in.readUTF();
Как правильно сохранить значение String из DataInputStream в переменную String?
2 ответа
Вы записываете данные один раз, а с другой стороны вы пытаетесь прочитать их дважды, но там есть только одна копия данных для чтения.
DataInputStream in = new DataInputStream(server.getInputStream());
System.out.println(in.readUTF());
//This prints "My String Message"
Это также использует единственную копию строки, которая присутствовала в потоке.
Сейчас происходит то, что программа на стороне сервера застревает в строке:
String msg = in.readUTF();
Когда вы звоните in.readUTF()
во второй раз он ждет, пока клиент отправит больше данных (другую строку), но, поскольку клиент никогда не отправляет больше данных, он будет ждать вечно (или до тех пор, пока вы не уничтожите его или не истечет время ожидания соединения).
Как объяснял @david-conrad, при первом чтении входной буфер становится пустым для следующих чтений, поэтому решение остается в буферизации сначала содержимого в строку, а затем вы можете использовать эту строку для чего угодно (например, println),
DataInputStream in = new DataInputStream(server.getInputStream());
String msg = in.readUTF();
System.out.println(msg);