TCP клиент / сервер в одном классе - PullRequest
0 голосов
/ 11 декабря 2011

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

Упрощенный код выглядит следующим образом:

public class Server {
public static void main(String[] args){
    try {
        ServerSocket ssocket = new ServerSocket(1234);
        Socket socket = new Socket("localhost", 1234);
        socket = ssocket.accept();

        String data = "Hello World";
        PrintWriter out;
        out = new PrintWriter(socket.getOutputStream(), true);
        System.out.print("Sending string: '" + data + "'\n");
        out.print(data);
        out.flush();

        BufferedReader in = new BufferedReader(new
                InputStreamReader(((Socket) socket).getInputStream()));
        System.out.print("Received string: '");

        while (!in.ready()) {}
        System.out.println(in.readLine());
        System.out.print("'\n...");
        in.close();
    } catch (UnknownHostException e2) {
        e2.printStackTrace();
    } catch (IOException e2) {
        e2.printStackTrace();
    }
}
}

При запуске кода я получаю следующий вывод:

Sending string: 'Hello World'
Received string: '

Почему я не могу прочитать поток ввода?

1 Ответ

1 голос
/ 11 декабря 2011

Переменная socket указывает на два разных объекта Socket, в свою очередь: во-первых, это тот, который вы создаете в качестве клиента для сервера.Во-вторых, есть тот, который возвращает ServerSocket, который связан с клиентом.Когда вы создаете второй, вы выбрасываете ссылку на первый.Но когда вы печатаете данные в одном из сокетов, они будут отображаться в другом.Поскольку у вас есть только ссылка на один из двух сокетов, вы никогда не сможете наблюдать за поступлением данных.

Если вы собираетесь использовать клиента и сервер в одном процессе, говоритедруг другу, вам действительно нужно использовать отдельные темы.Как правило, в таких простых программах, как эта, серверная часть создает новый поток, в котором обслуживается каждое соединение.Это будет хорошо работать здесь.

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