Java-клиент / серверные сокеты

Я начинаю с Java-сокетов и получаю странный вывод. Вот мой источник для методов сокетов:

Исходный код клиента:

public void loginToServer(String host, String usnm ) {
    try {
        Socket testClient = new Socket(host,1042);
        System.out.println ("Connected to host at " + host);
        logString = ("CONNECTED: " + host);
        outGoing = new PrintWriter(testClient.getOutputStream(), true);
        outGoing.print("Hello from " + testClient.getLocalSocketAddress());
        InputStream inFromServer = testClient.getInputStream();
        DataInputStream in = new DataInputStream(inFromServer);
        System.out.println("Server says " + in.readLine());
        testClient.close();
    }
    catch (Exception e) {
        System.err.println ("Error connecting to host at " + host + ":1042.\n Reason: " + e);
        logString = ("CONNECT FAILED: " + host + ":1042: " + e);
    }
    printLog(logString);
    // send server usnm and os.name [System.getProperty(os.name)] ?
}

И код сервера:

public void runServer() {
        try{
            server = new ServerSocket(1042); 
        }
        catch (IOException e) {
            printLog("LISTEN FAIL on 1042: " + e);
            System.err.println("Could not listen on port 1042.");
            System.exit(-1);
        }
        try{
            client = server.accept();
        }
        catch (IOException e) {
            printLog("ACCEPT FAIL on 1042: " + e);
            System.err.println("Accept failed: 1042");
            System.exit(-1);
        }
        try{
            inComing = new BufferedReader(new InputStreamReader(client.getInputStream()));
            outGoing = new PrintWriter(client.getOutputStream(), true);
        }
        catch (IOException e) {
            printLog("READ FAIL on 1042: " + e);
            System.err.println("Read failed");
            System.exit(-1);
        }
        while(true){
            try{
                clientData = inComing.readLine();
                //processingUnit(clientData, client);
                outGoing.print("Thank you for connecting to " + server.getLocalSocketAddress() + "\nGoodbye!");
            }
            catch (IOException e) {
            printLog("READ FAIL on 1042: " + e);
                System.out.println("Read failed");
                System.exit(-1);
            }
        }
    }

И результат, который дал клиент, был просто Connected to host at localhost,

В чем дело?

2 ответа

Решение

Вы читаете строки, но не отправляете строки. + Изменить print() в println(), readLine() навсегда заблокирует ожидание новой строки. Он вернет ноль в конце потока, то есть, когда одноранговый узел закрывает соединение, но вы также не проверяете это, поэтому вы зацикливаетесь на неопределенное время.

Вы пишете текст и читаете двоичный файл. Поскольку ваш вывод и ввод не совпадают, в этом случае весьма вероятно зависание.

Я предлагаю вам использовать двоичный файл с writeUTF/readUTF или текст с println/readLine.

Кстати: readUTF считывает два байта, чтобы определить длину данных для чтения. Поскольку первые два байта являются текстом ASCII, вы, вероятно, подождите около 16 000 символов, прежде чем вернуться.

Другие вопросы по тегам