2012-04-21 2 views
0

Итак, я установил базовое соединение клиент/сервер, и я пытаюсь отправить сообщение друг другу по соединению, я получил клиент для получения сообщения с сервера, но сервер не получает сообщение клиентов. Вот мой текущий код для считывания переданных данных от клиента:Java-сервер Socket, чтение содержимого из DataInputStream

ServerThread.socket = new ServerSocket(5556); 
Socket client = ServerThread.socket.accept(); 
DataInputStream in = new DataInputStream 
    (
     new BufferedInputStream(client.getInputStream()) 
    ); 
String s = in.readUTF(); 
System.out.println("Client: " + s); 

Используя, что он не печатать ничего, даже не просто «Клиент:»

Вот мой код для моего подключения клиента , и отправку сообщения. Примечание: Я написал эту часть в VB:

client = New TcpClient() 
client.Connect("myiphere", 5556) 
Dim stream As NetworkStream = client.GetStream() 
Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes("Hello server") 
stream.Write(sendBytes, 0, sendBytes.Length) 

Есть ли причина, по которой данные не получены? Или почему это задерживается? Я пробовал использовать Java-часть кода с помощью блока catch try, но ошибка не испускается.

Любая помощь будет оценена по достоинству.

+0

Вы очищаете выходной поток сокета клиента VB? –

+0

Нет, я этого не делал, я покраснел и все равно не изменился. –

ответ

0

UTFs в DataInputStream: добавлено с 0 и длиной.

Я не сделал много с VB, так что я не знаю, если есть и другие ошибки, но попробуйте:

stream.Write(0, sendBytes.Length, sendBytes) 

Я не должен предложить код в языка я не знаю. Если вы хотите прочитать его с помощью readUTF, вам придется отправить байт 0 и байт, равный длине строки, прежде чем отправлять текстовые байты.

Редактировать: Возможно, вы действительно не захотите использовать DataInputStream. Он предназначен для хранения двоичных потоков. Если вы получаете текст, попробуйте это на стороне Java:

BufferedReader in = new BufferedReader(
    new InputStreamReader(
     client.getInputStream() 
    ) 
); 
String s = in.readLine(); 

Если вы не отправки текста, просто создать BufferedInputStream, как вы сделали, и прочитать байт от него.

+0

Не работает извините. Для функции Write требуются следующие параметры: Byte Array, int, int. –

+0

О, я вижу. Опять же, я не знаю VB - я думал, что вы отправляете эти целые числа в виде байтов в конце потока. Вам нужно отправить байт '0', байт, равный' sendBytes.Length', а затем сами данные. – maybeWeCouldStealAVan

+0

Кроме того, вы уверены, что хотите использовать DataInputStream для текста? – maybeWeCouldStealAVan

0

Как возможноWeCouldStealAVan указал, readUTF ожидает два байта, указывающих, сколько еще байтов содержимого есть. См. http://docs.oracle.com/javase/6/docs/api/java/io/DataInput.html#readUTF().

Однако его решение с использованием InputStreamReader не работает, потому что InputStreamReader ожидает ввода UTF-16 (два байта на символ), но ваш клиент VB отправляет ascii. Я бы предложил сделать ваш VB-клиент, отправив UTF-16, если вы можете (тогда используя java-код MaybeWeCouldStealAVan). Если вы не можете этого сделать (извините, я не знаю, какие кодировки VB допускает), тогда просто напишите дополнительные два байта, необходимые для работы readUTF.

Смежные вопросы