【问题标题】:how to read multiple lines from client to server如何从客户端读取多行到服务器
【发布时间】:2020-08-25 15:05:35
【问题描述】:

所以我每次在客户端控制台中输入内容时都会尝试发送多行代码。但是,这样做时它只会在服务器中打印一次客户端的输出,我想做的是每次输入一行后在服务器中打印客户端的输出。

客户:

    try {
        
        Scanner scanner = new Scanner(System.in);
        
        DataInputStream inputStream = new DataInputStream(socket.getInputStream());
        DataOutputStream outputStream;
        
        System.out.println("Write something to client:");
        
        while(scanner.hasNext()) {
            
            System.out.println("Write something to client:");
            outputStream = new DataOutputStream(socket.getOutputStream());
            
            
            String message = scanner.nextLine();
            
            outputStream.writeUTF(message);
        }
        
    } catch (IOException e) {
        System.out.println("[ERROR] Unable to get streams from server");
    }
}

客户端线程:

    @Override
public void run() {
    
    try {
        
        DataInputStream inputStream = new DataInputStream(socket.getInputStream());
        DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
        
        System.out.println(inputStream.readUTF());
        
    } catch (IOException e) {
        e.printStackTrace();
    }
}

服务器: 公共服务器() {

    try {
        serverSocket = new ServerSocket(port);
        System.out.println("[SERVER] Server initialized successfully");
        // consider using!
        Runtime.getRuntime().addShutdownHook(new Thread());

    } catch (IOException e) {
        System.out.println("[ERROR] Unable to launch server on port " + port);
    }

    while (true) {
        Socket socket = null;

        try {
            socket = serverSocket.accept();
        } catch (IOException e) {
            System.out.println("[ERROR] Unable to accept client request");
        }

        System.out.println("[SERVER] New user joined the chat: " + socket);

        groupCounter++;
        ClientThread client = new ClientThread("Client " + groupCounter, socket);

        Thread thread = new Thread(client);
        thread.start();

        groupClients.add(client);

        //System.out.println(groupCounter);

        
        
    }

【问题讨论】:

  • “它只在服务器上打印客户端的输出一次”是什么意思?是因为服务器关闭了套接字吗?你能告诉我们你是如何创建套接字对象的吗?
  • 没有服务器不会关闭它的套接字,但如果我在客户端控制台输入中输入内容,它只会在服务器控制台中打印一次。我想做的是对于我在客户端控制台中打印的每一行,我想让它也出现在服务器控制台中。我添加了一些代码来展示我如何处理套接字对象
  • 那么,是因为客户端停止了执行吗?您还在 Client 类中使用 while(true) 吗?
  • while(true) 循环在客户端没有帮助,但扫描器不会连续写入 hasNext while 循环看起来的输出流。

标签: java networking client-server


【解决方案1】:

问题出在服务器端,serverSocket.accept() 停止执行并等待客户端连接到服务器套接字。这就是为什么您每次只收到一条消息。

在 ClientThread 中添加一个无限循环,以确保它继续读取客户端套接字输入。

try {
    while (true) {
        DataInputStream inputStream = new DataInputStream(socket.getInputStream());
        DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());

        System.out.println(inputStream.readUTF());
    }
} catch (IOException e) {
    e.printStackTrace();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2012-09-21
    相关资源
    最近更新 更多