Связь между клиентом и сервером имеет некоторые глюки - PullRequest
1 голос
/ 03 марта 2012

Я получил здесь клиентские и серверные программы.Клиент обращается к серверу, отправляя строку, затем сервер преобразует строку в заглавные буквы и отправляет обратно.Проблема в том, что клиент не получает никакой строки с сервера.Только сервер печатает 2, переданные в строках, затем сервер выдает IOException.Я думаю, потому что клиент закрыл соединение.Но почему клиент не получает сообщения от сервера?Как преодолеть эту проблему?Спасибо

Client:
package solutions;

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

class SocketExampleClient {

    public static void main(String [] args) throws Exception {

    String host = "localhost"; // hostname of server
    int port = 5678;           // port of server
    Socket s = new Socket(host, port);
    DataOutputStream dos = new DataOutputStream(s.getOutputStream());
    DataInputStream dis = new DataInputStream(s.getInputStream());

    dos.writeUTF("Hello World!");
    System.out.println(dis.readUTF());

    dos.writeUTF("Happy new year!");
    System.out.println(dis.readUTF());

    dos.writeUTF("What's the problem?!");
    System.out.println(dis.readUTF());

    }
}

Сервер:

package solutions;

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

class SocketExampleServer {

    public static void main(String [] args) throws Exception {

    int port = 5678;
    ServerSocket ss = new ServerSocket(port);
    System.out.println("Waiting incoming connection...");

    Socket s = ss.accept();
    DataInputStream dis = new DataInputStream(s.getInputStream());
    DataOutputStream dos = new DataOutputStream(s.getOutputStream());

    String x = null;

    try {
        while ((x = dis.readUTF()) != null) {

        System.out.println(x);

        dos.writeUTF(x.toUpperCase());
        }
    }
    catch(IOException e) {
        System.err.println("Client closed its connection.");
    }
    }
}

Вывод:

Waiting incoming connection...
Hello World!
Happy new year!
What's the problem?!
Client closed its connection.

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

Ваша основная программа завершает работу, прежде чем она сможет прочитать ответ с сервера. Если вы добавите следующий код, он будет работать нормально. :) ОБНОВЛЕНИЕ - Я только что понял, что ваш код работает нормально на моем компьютере - и выводит строку, как и ожидалось. DataInputStream.readUTF () правильно блокирует и получает ответ. У вас все еще есть проблема?

Thread t = new Thread(){
public void run()
{
    for(;;)
    {
        String s = null;
    try 
        {
        s = dis.readUTF();
    } 
        catch (IOException e) 
        {
        e.printStackTrace();
        }
        while(s!=null)
        {
            System.out.println("Output: " + s);
        try 
        {
        s = dis.readUTF();
    } 
        catch (IOException e) 
        {
        e.printStackTrace();
    }
    }}}};
   t.start();
0 голосов
/ 03 марта 2012

Где в коде вашего клиента вы ждете ввода с сервера?abviosuly, когда ваш клиент заканчивает отправку сообщений, которые он завершает, и сокет закрывается.

Вы должны запустить отдельный поток для прослушивания ответов Сервера или посмотреть в этом примере

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