使用在客户端阻塞的套接字的客户端-服务器通信

Client-Server communication using sockets blocked at client-side

我正在编写一个简单的 local 客户端-服务器程序,它应该执行以下操作:

  1. 客户端将他的名字发送到服务器 ("client1")
  2. 服务器returns一个字符串"hello client1"

我遇到的问题是 "hello client1" 消息从未被检索到,相反程序只是保持 运行ning 而没有抛出任何异常或错误。我猜它与阻塞 bufferedReader 的 readLine 方法有关,但我还没有找到解决问题的合适方法。对于 运行 本地程序(参见 Main),我使用了一个 serverThread 和一个 clientThread,也许这也是问题的一部分。

注意:在下面的代码中,我在似乎导致问题的行上放置了注释块,其余代码 运行 没问题:

服务器:

public class Serverside implements Runnable{
    PrintStream out;
    int port;

    Serverside(int port){
        out = new PrintStream(System.out);
        this.port = port;
    }

    void start(){
        try{
            ServerSocket serverSocket = new ServerSocket(port);
            Socket connSocket = serverSocket.accept();

            BufferedReader clientInput = new BufferedReader(new InputStreamReader(connSocket.getInputStream()));
            DataOutputStream clientOutput = new DataOutputStream(connSocket.getOutputStream());

            String clientName = clientInput.readLine();
            String reply = "Hello " + clientName + "\n";

            //clientOutput.writeBytes(reply);

            clientOutput.close();
            clientInput.close();
            connSocket.close();
            serverSocket.close();
        }catch(Exception e){
            out.println("Server: An exception has been thrown: " + e.getMessage());
        }
    }

    @Override
    public void run() {
        out.println("Server running");
        start();
    }
}

客户:

public class ClientSide implements Runnable {

    String hostname;
    String clientName;
    int port;

    public ClientSide(String name, int port) {
        hostname = "localhost";
        this.port = port;
        clientName = name;
    }

    void start(){
        try{
            Socket connSocket = new Socket(hostname, port);

            BufferedReader serverInput = new BufferedReader(new InputStreamReader(connSocket.getInputStream()));
            DataOutputStream serverOutput = new DataOutputStream(connSocket.getOutputStream());

            serverOutput.writeBytes(clientName);

            //String reply = serverInput.readLine();
            //System.out.println("Server says: " + reply);

            serverOutput.close();
            serverInput.close();
            connSocket.close();
        }catch(Exception e){
            System.out.println("Client: An exception has been thrown: "  + e.getStackTrace().toString());
        }

    }

    @Override
    public void run() {
        System.out.println("Client-side running");
        start();
    }
}

主要:

public class Main {

    static final int PORT = 20000;

    void start() {
        Serverside server = new Serverside(PORT);
        ClientSide client = new ClientSide("Elias",PORT);

        Thread serverThread = new Thread(server);
        Thread clientThread = new Thread(client);

        clientThread.start();
        serverThread.start();
    }

    public static void main(String[] args) {
        new Main().start();
    }

}

您正在读取线路但没有发送线路。您需要在客户端名称中添加一个行终止符。