Сервер не получает байты, записанные в сокет приложением Java - PullRequest
0 голосов
/ 23 июня 2009

У меня есть следующее клиентское приложение для сокетов Java, которое отправляет ту же строку на сервер сокетов:

import java.net.*;
import java.io.*;

public class ServerClient {
public static void main(String[] args) throws IOException {
    System.out.println("Starting a socket server client...");
    Socket client = new Socket("XXX.X.XXX.XX", 12001);
    BufferedOutputStream stream = new BufferedOutputStream(client.getOutputStream());
    String message = "ABC";

    BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in));      
    String input = null;
    while ( true ) {
        System.out.print("Would you like to send a message to Server? ");
        input = inputReader.readLine();
        if ( !input.equals("Y") ) break;    

        System.out.println("Message to send: " + message);
        System.out.println("Message length is: " + message.length());

        byte[] messageBytes = message.getBytes("US-ASCII");
        stream.write(messageBytes, 0, messageBytes.length);
        stream.flush();
    }
    System.out.println("Shutting down socket server client...");        
    stream.close();
    client.close();
    inputReader.close();
}
}

При первом отправлении сообщения сервер получает сообщение; однако каждый раз, когда я пытаюсь отправить это сообщение, сервер ничего не получает. Сообщение просто исчезает. Я успешно пишу в сокет (без исключений), но с другой стороны канала ничего не происходит (или мне так сказали).

У меня нет доступа к серверному приложению, журналам или коду, поэтому мне интересно, есть ли какой-нибудь подход, который вы можете порекомендовать выяснить, почему сервер не получает последующие сообщения. Любые идеи будут с благодарностью!

Разъяснение :

  1. Новые строки не ожидаются сервером; в противном случае, как бы он получил сообщение в первый раз? В качестве метода проб и ошибок я попытался отправить символы '\ n' и "\ r \ n" и 0x00 в конце строки - и все безуспешно.

  2. Я думал, что очистка была проблемой, поэтому я попробовал различные классы outputtream (PrintStream, PrintWriter, FilterOutputStream), но все еще сталкивался с точно такими же проблемами. Тогда, если «промывка» является проблемой, как она работает в первый раз?

Ответы [ 3 ]

1 голос
/ 23 июня 2009

Помните:

  • TCP ориентирован на поток. не ориентированный на сообщения.
  • Одна запись на клиенте может занять несколько чтений на сервере, чтобы ... read
  • Несколько записей на клиенте могут быть прочитаны сервером за одно чтение
  • Вы вряд ли увидите вышеописанные сценарии в тестовом приложении в локальной сети, вы увидите их очень быстро в рабочей среде или когда вы начнете действительно ускорять отправку / получение.

После этого, если вы отправляете сообщения , вам нужен разделитель или какой-либо другой способ указания «вот одно сообщение», например, определяя протокол как «первый байт - это длина следующего сообщения». И вам нужно будет проверить получателя, читает ли оно частичное сообщение, целое сообщение и любую их комбинацию (например, одно чтение могло прочитать 3 с половиной сообщения ...).

Быстрое решение для вашего тестового приложения, напишите строки. То есть строка, за которой следует символ перевода строки. ReadLine () буферизированного читателя может затем позаботиться о повторной сборке для вас на принимающей стороне.

1 голос
/ 23 июня 2009

Другие тесты:

1 - используйте сетевой сниффер, чтобы увидеть, что происходит в сети

2 - используйте какую-нибудь программу, например TCP Test Tool , чтобы отправить данные на сервер и смоделировать вашу программу. (netcat также может быть использован, но он посылает новую строку после каждой строки)

0 голосов
/ 23 июня 2009

Здесь работает правильно ... но мне не хватает возврата каретки или какого-либо другого конца сообщения после отправки сообщения. Трудно написать больше, не зная, что сервер ожидает (протокол) ... Может быть, вы должны попробовать что-то вроде

String message = "ABC\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...