Как заставить сервер отправлять клиенту сообщение о подключении? - PullRequest
1 голос
/ 10 марта 2011

Я пытаюсь написать базовую программу клиент-сервер, чтобы позволить клиенту просматривать файлы сервера.Я хочу, чтобы при подключении клиента сервер отправлял клиенту список всех файлов в текущем каталоге.Как бы я поступил так?Я уже создал массив всех имен файлов, и пытаюсь отправить их клиенту, он просто сидит в бесконечном цикле (как и должно быть!) И ничего не делает.

Попытка получить серверотправьте сообщение о подключении клиента:

    DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());


    boolean found = false;

    //Read the data from the input stream
    for (int i=0;i < fileList.length;i++) {
      outToClient.writeBytes(fileList[i].getName());
    }

И чтобы сервер получил это:

//Prepare an object for reading from the input stream
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

//Read the data from the input stream
sentence = inFromServer.readLine();

, но при этом клиент просто сидит в бесконечном цикле и ничего не делает.

Помогите пожалуйста?

Ответы [ 4 ]

1 голос
/ 17 октября 2011

В моем базовом примере TCP-сервер-клиент я делаю способ ... когда клиент принят, он получает приветственное сообщение.В том, что когда со стороны клиента я отправляю роль, мне возвращается имя.Вот ссылка на источник >> http://matrixsust.blogspot.com/2011/10/basic-tcp-server-client.html.

Надеюсь, это поможет.

1 голос
/ 10 марта 2011

Ваша основная проблема заключается в том, что вы пытаетесь отправить пустую строку с клиента на сервер.Пустая строка преобразуется в байтовый массив длиной 0.По сути, вы не отправляете никаких данных между клиентом и сервером.В этой ситуации ваш сервер будет продолжать ожидать получения данных через InputStream сокета.Поскольку сервер все еще ждет, он не переходит к отправке данных обратно клиенту.В результате, когда ваш клиент пытается прослушивать данные с сервера, он ждет бесконечно, так как сервер никогда не достигает этой части кода.

Если ваша цель состоит в том, чтобы сервер просто отправлял данные при подключении, у вас есть несколько вариантов.

  1. При подключении сервер должен немедленно отправить список клиенту.Вам не нужно иметь двустороннюю связь здесь.Клиент может немедленно начать прослушивание InputStream.
  2. Пусть клиент отправит серверу не менее 1 байта, который сервер сможет получить через свой InputStream, а затем продолжит обработку.Если вам нужно выполнить несколько функций, то вам может понадобиться отправить строковое значение, которое что-то означает, например, out.write ("list" .getBytes ("UTF-8"));Затем сервер может выполнить операцию на основе полученного значения.

Пример сервера:

ServerSocket socket = new ServerSocket(8888);
Socket cSocket = socket.accept();

PrintWriter out = null;
try {
    out = new PrintWriter(new OutputStreamWriter(cSocket.getOutputStream()));

    for (String file : new File(".").list()) {
        out.println(file);
    }
}
finally {
    if (out != null) {
        out.close();
    }
    cSocket.close();
    socket.close();
}

Пример клиента:

Socket s = new Socket("localhost", 8888);
BufferedReader in = null;

try {
    in = new BufferedReader(new InputStreamReader(s.getInputStream()));

    String line;
    while ((line = in.readLine()) != null) {
        System.out.println(line);
    }
}
finally {
    if (in != null) {
        in.close();
    }
    s.close();
}
1 голос
/ 10 марта 2011

Сначала убедитесь, что между клиентом и сервером установлено следующее рукопожатие:

  1. сервер прослушивания
  2. клиент, подключающийся
  3. сервер принимает
    теперь есть два пути:
  4. сервер прослушивает команду
  5. клиент отправляет команду 'dir'
  6. клиент начинает слушать
  7. сервер отправляет обратно ваш список
    альтернативный путь:
  8. клиент слушает
  9. сервер отправляет список
  10. сервер начинает слушать

... нормальное общение.
Отправка сообщений 0 размера может иногда вызывать проблемы.
Таким образом, использование подхода «запрос-ответ» представляется точным.

0 голосов
/ 10 марта 2011

Я не верю, что сервер может отправить сообщение клиенту без запроса. Отправьте сообщение «dir» и прослушайте на сервере, затем прослушайте на клиенте и ответьте.

...