ClientSocket НЕ слушает - PullRequest
       15

ClientSocket НЕ слушает

0 голосов
/ 15 октября 2019

Я изумлен.

Я взял код с https://docs.oracle.com/javase/tutorial/networking/sockets/examples/EchoServer.java

для сервера. И https://docs.oracle.com/javase/tutorial/networking/sockets/examples/EchoClient.java

для Клиента. Я сделал небольшие изменения. Главным образом, чтобы не было обратного эхо. Скорее Сервер должен постоянно с 2-секундными задержками отправлять одну и ту же строку. Но я просто не могу понять, почему клиент не работает. Он отправляет сообщение об исключении: Не удалось получить ввод / вывод для соединения с 127.0.0.1 Я запускаю сервер с: java 6788 и клиент с: 127.0.0.1 6788 Я пробовал другие порты.

Я делаю это в eclipse, поэтому задаю аргументы в Runconfiguration перед запуском классов. Я запускаю сервер первым. Я пробовал в терминале за пределами затмения. Ничто не заставляет это работать. По сути, клиент должен подключиться к серверу и вывести с помощью System.out.println (), что сервер, в свою очередь, выдает клиенту. Но ничего не происходит. что не так?

Клиент:

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

public class EchoClient {
    public static void main(String[] args) throws IOException {

        if (args.length != 2) {
            System.err.println(
                "Usage: java EchoClient <host name> <port number>");
            System.exit(1);
        }

        String hostName = args[0];
        int portNumber = Integer.parseInt(args[1]);

        try (
            Socket echoSocket = new Socket(hostName, portNumber);
            BufferedReader in =
                new BufferedReader(
                    new InputStreamReader(echoSocket.getInputStream()));

        ) {
            String userInput;

            while (true) {
                System.out.println("recieved: " + in.readLine());
            }
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host " + hostName);
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to " +
                hostName);
            System.exit(1);
        } 
    }
}

Сервер:

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

public class EchoServer {
    public static void main(String[] args) throws IOException {

        if (args.length != 1) {
            System.err.println("Usage: java EchoServer <port number>");
            System.exit(1);
        }

        int portNumber = Integer.parseInt(args[0]);
        System.out.println(args[0]);
        InetAddress add = InetAddress.getLocalHost();
        System.out.println(add.getHostAddress());
        try (
            ServerSocket serverSocket =
                new ServerSocket(Integer.parseInt(args[0]));

            Socket clientSocket = serverSocket.accept();     
            PrintWriter out =
                new PrintWriter(clientSocket.getOutputStream());                   

        ) {
            while (true) {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                out.println("HELLO!");
            }
        } catch (IOException e) {
            System.out.println("Exception caught when trying to listen on port "
                + portNumber + " or listening for a connection");
            System.out.println(e.getMessage());
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Вы должны отправить ответ клиенту.

Добавить out.flush();

while (true) {
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    out.println("HELLO!");
    out.flush();
}
0 голосов
/ 18 октября 2019

Как и в комментарии, я в конце концов нашел решение. BufferedReader.readLine () "заблокирован". При чтении из файла он возвращает строку после чтения до символа новой строки, если я правильно понимаю. Но поскольку это был «устойчивый поток» с сервера без новых строк, он просто продолжал «читать» и никогда не возвращал строку.

Затем я попытался использовать метод BufferedReader.read (), который читает символ за символом,и возвращается после каждого символа (таким образом, никогда не блокируется). Затем он печатает каждый символ по мере его поступления, также он прослушивает новую строку, отправляемую с сервера, и как только прочитанный символ равен новой строке, он вместо этого печатает новую строку. В некотором роде имитирует поведение «строки чтения», которое я ожидал от исходного вопроса.

Чтение части клиента:

    while(true) {
        character = (char) reader.read();
        if(Character.isISOControl(character)) {
            System.out.println();
        }
        else {
            System.out.printf("%c", character);
        }           
    }

Отправка части сервера:

private String message = "HELLO\n";
...
while(true) {
            try {
                Thread.sleep(2000);
                writer.write(message);
                writer.flush();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
...