2015-01-07 2 views
-1

Я работаю над приложением, состоящим из сокетов. Он должен передать значение String от клиента (Android-устройство) к серверу (мой компьютер с Ubuntu). В коде на стороне сервера мне нужно сохранить значение, передаваемое через сокет в переменной String.Как получить строку из DataInputStream в Java?

Вот код, который я использую, чтобы отправить значение 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

Вы читаете его дважды, но только записываете его один раз. Вы не можете прочитать его дважды, если вы только пишете его один раз. –

+0

Хороший улов !. Но все же я ищу лучший способ сделать это. – priyankvex

+0

У вас уже есть лучший способ сделать это, подчиняясь только 16-битовому ограничению. – EJP

ответ

1

Вы записываете данные один раз, а с другой стороны вы пытаетесь прочитать его дважды, но есть только одна копия данных, которые необходимо прочитать.

DataInputStream in = new DataInputStream(server.getInputStream()); 
System.out.println(in.readUTF()); 
//This prints "My String Message" 

Это также использует единственную копию строки, которая присутствовала в потоке.

Прямо сейчас, что происходит это программа на стороне сервера с застрять на линии:

String msg = in.readUTF(); 

При вызове in.readUTF() во второй раз, он ждет клиент, чтобы передавать больше данных (другая строка), но поскольку клиент никогда не отправляет больше данных, он будет ждать вечно (или пока вы не убьете его, или время соединения).

0

Как объяснил @ david-conrad, когда вы впервые прочитали, буфер ввода становится пустым для следующих чтений, поэтому решение остается в буферизации сначала содержимого в строку, а затем вы можете использовать эту строку для чего угодно (println , например).

DataInputStream in = new DataInputStream(server.getInputStream()); 
String msg = in.readUTF(); 
System.out.println(msg); 
Смежные вопросы