Java TCP-сервер и клиент работают, но не могут получить ответ

#java #tcp

#java #tcp

Вопрос:

Я пытаюсь создать небольшой TCP-сервер / клиент. У меня есть клиент и сервер, и после решения некоторых основных исключений ничего не работает. Предполагается, что клиент отправляет (пользовательские) данные на сервер (на порт 6789, localhost), который затем должен записать их в верхнем регистре и завершить их обратно. Кажется, все работает, за исключением отправки обратно заглавной буквы. Вот этот код:

TCPServer:

 import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {

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

        System.out.println("SERVER");

        String clientSentence;
        String capitalizedSentence;
        ServerSocket server = new ServerSocket(6789);


        TCPClient.main(null);


        while (true) {
            Socket connection = server.accept();
            System.out.println("<S> Connection!");
            BufferedReader fromClient = new BufferedReader(
                new InputStreamReader(connection.getInputStream()) );
            DataOutputStream toClient = new DataOutputStream(connection.getOutputStream());

            clientSentence = fromClient.readLine();
            System.out.println("<S> Recieved: "   clientSentence);

            capitalizedSentence = clientSentence.toUpperCase()   'n';
            System.out.print("About to send: "   capitalizedSentence);
            toClient.writeBytes(capitalizedSentence);
        }
    }

}
  

TcpClient Клиент:

 import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class TCPClient {

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

        System.out.println("CLIENT");

        String sentence;
        String modSentence;
        BufferedReader inUser = new BufferedReader(new InputStreamReader(System.in));

        Socket clientToServer = new Socket("localhost", 6789);
        DataOutputStream outServer = new DataOutputStream(clientToServer.getOutputStream());
        BufferedReader inServer = new BufferedReader(
            new InputStreamReader(clientToServer.getInputStream()) );

        System.out.println("<C> Type now: ");
        sentence = inUser.readLine();
        System.out.println("<C> Got it!");

        System.out.println("<C> Sending "   sentence   " to server...");
        outServer.writeBytes(sentence   'n');
        outServer.flush();

        System.out.println("<C> Server respodse:");
        modSentence = inServer.readLine();

        System.out.println("<C> From server: "   modSentence);
        clientToServer.close();
    }
}
  

Консоль:

 SERVER
CLIENT
<C> Type now: 
efd
<C> Got it!
<C> Sending efd to server...
<C> Server respodse:
asd
  

и…

Ничего

Комментарии:

1. Вы забыли сбросить ответ сервера

2. Кажется, я понял (наконец-то)! Вероятно, это как-то связано с тем фактом, что я запускаю клиент и сервер в одном потоке, верно? Таким образом, цикл никогда не будет доступен

3. Это отдельные программы, они выполняются в отдельных процессах

4. кстати: хороший стиль кодирования. Особенно хороши имена ваших переменных. Я использую больше методов, но для новичка действительно хороший код!

Ответ №1:

Ответ: я глупый.

Я случайно позволил клиенту и серверу работать в одном потоке. Теперь я сделал TCPClient Runnable , и все работает, как планировалось.

ПРИМЕЧАНИЕ: TCPClient.main(null) не запускается новая программа / поток, просто тот же поток, другая статическая функция.

Ответ №2:

Вы сбрасываете на стороне клиента, но не на стороне сервера!

Просто добавьте

 toClient.flush()
  

вызов на стороне сервера тоже!