Серверный сокет не отправляет данные обратно в Java - PullRequest
0 голосов
/ 28 июня 2018

Итак, я только что узнал, как сделать socket с и все эти хорошие вещи в Java, и поэтому моя первая попытка получила сообщение от клиента, а затем сбой клиента. То, что должно было случиться, было получить сообщение от клиента, если это сообщение равно этому, затем отправить данные обратно. Однако функция if, если сообщение было правильным, не сработала, даже если сообщение было правильным.

Даже когда я удаляю функцию if, чтобы проверить, была ли строка правильной или нет, программа все равно зависает. И, кстати, мой сервер - это консольное приложение, а мой клиент - приложение SWT.

Вот код сервера с удаленной функцией if:

try {
    System.out.println("Waiting for a connection...");
    // Start a server
    ServerSocket server = new ServerSocket(3211);
    // Listen for anyone at that port
    Socket socket = server.accept();
    System.out.println("The client has connected!");
    // Get the data being sent in
    DataInputStream inputStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
    DataOutputStream ouputStream = new DataOutputStream(socket.getOutputStream());
    // Turn that into UTF-8
    String data = inputStream.readUTF();
    System.out.println("Received " + data);
    ouputStream.writeUTF("Great!");
    System.out.println("Awesome!");
    socket.close();
    inputStream.close();
    ouputStream.close;
    server.close();
    System.out.println("Socket closed\n-----------------------------");
}
catch(IOException e) {
    System.out.println(e);
}

И клиент (который срабатывает при нажатии кнопки):

try {
    allMessagesTextBox.setText(allMessagesTextBox.getText() + "\nConnecting to the server...");
    Socket socket = new Socket("192.168.1.206", 3211);
    allMessagesTextBox.setText(allMessagesTextBox.getText() + "\nConnected to the server!");
    DataInputStream input = new DataInputStream(System.in);
    DataOutputStream output = new DataOutputStream(socket.getOutputStream());
    output.writeUTF("sweet");
    String data = input.readUTF();
    allMessagesTextBox.setText(allMessagesTextBox.getText() + "\nSERVER: " + data);
    input.close();
    output.close();
    socket.close();

}
catch (IOException er) {
    allMessagesTextBox.setText(allMessagesTextBox.getText() + "\n" + er);
}

Как только я нажимаю кнопку, чтобы попытаться установить соединение (с уже запущенным сервером), клиент мгновенно зависает. Он даже не отправляет какие-либо вещи типа «подключение к серверу».

Есть идеи, что происходит и как это исправить?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Ваш клиент читает с System.in. Это должно быть чтение из входного потока сокета.

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

0 голосов
/ 28 июня 2018

Ваш сокет не может отправить данные, потому что вы не вызвали метод .flush() в вашей ссылке outputstream. Используйте это, и вам не нужно явно писать flush() и close() метод для потоков

Код сервера

System.out.println("Waiting for a connection...");
// Start a server
try (ServerSocket server = new ServerSocket(3211)) {
    // Listen for anyone at that port
    try (Socket socket = server.accept()) {
        System.out.println("The client has connected!");
        // Get the data being sent in
        try (DataInputStream inputStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()))) {
            try (DataOutputStream ouputStream = new DataOutputStream(socket.getOutputStream())) {
                // Turn that into UTF-8
                String data = inputStream.readUTF();
                System.out.println("Received " + data);
                ouputStream.writeUTF("Great!");
                System.out.println("Awesome!");
           }
        }
    }
    System.out.println("Socket closed\n-----------------------------");
} catch (IOException e) {
    System.out.println(e);
}

Код клиента

try {
    allMessagesTextBox.setText(allMessagesTextBox.getText() + "\nConnecting to  the server...");
    try (Socket socket = new Socket("127.0.0.1", 3211)) {
        allMessagesTextBox.setText(allMessagesTextBox.getText() + "\nConnected to the server!");
        try (DataInputStream input = new DataInputStream(socket.getInputStream())) {
            try (DataOutputStream output = new DataOutputStream(socket.getOutputStream())) {
                output.writeUTF("sweet");
            }
            String data = input.readUTF();
            System.out.println(String.format("data received from server '%s':\n", data));
            allMessagesTextBox.setText(allMessagesTextBox.getText() + "\nSERVER: " +  data);
        }
    }
} catch (IOException er) {
    allMessagesTextBox.setText(allMessagesTextBox.getText() + "\n" + er);
}

Вывод на сервер

Waiting for a connection...
The client has connected!
Received sweet
Awesome!
Socket closed
-----------------------------

Вывод на клиент

data received from server 'Great!':

Теперь переходим к проблеме в вашем коде.

См. Код на стороне клиента, который вы написали DataInputStream input = new DataInputStream(System.in); вместо DataInputStream input = new DataInputStream(socket.getInputStream())

, что приводит к ошибке при получении сообщения от сервера

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