为啥客户端不能一次又一次地获取输入;它只是在一个输入和一个来自服务器的响应后变为空白?

Posted

技术标签:

【中文标题】为啥客户端不能一次又一次地获取输入;它只是在一个输入和一个来自服务器的响应后变为空白?【英文标题】:Why can't the client obtain input again and again; it just goes blank after one input and one response from the server?为什么客户端不能一次又一次地获取输入;它只是在一个输入和一个来自服务器的响应后变为空白? 【发布时间】:2021-12-05 15:05:28 【问题描述】:

客户端

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class ThreadClient 
    public static void main(String[] args) throws IOException 
        final String HOST = "127.0.0.1";
        final int PORT = 4040;
        
        System.out.println("Client started.");
        
        Socket socket = new Socket("127.0.0.1", 4040);
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        Scanner in = new Scanner(socket.getInputStream());
        Scanner s = new Scanner(System.in);
        while (true) 
            System.out.print("Input: ");
            String input = s.nextLine();
        System.out.println("Sent: " + input);
            out.println(input);
        while(!"End".equals(input))
                    System.out.println("Echoed from server: " + in.nextLine());

    
        
    
 

服务器端

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class ThreadServer 
  public static void main(String[] args) throws IOException 
        final int PORT = 4040;
        ServerSocket serverSocket = new ServerSocket(PORT);
        
        System.out.println("Server started...");
        System.out.println("Wating for clients...");
        
        while (true) 
            Socket clientSocket = serverSocket.accept();
            Thread t = new Thread() 
                public void run() 
                    try 
                        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
                        Scanner in = new Scanner(clientSocket.getInputStream());
                        while (in.hasNextLine()) 
                            String input = in.nextLine();
                            if (input.equalsIgnoreCase("exit")) 
                                break;
                             else if(input.equals("Hi"))
                out.println("How are you?");
                 else if(input.equals("Bye"))
                out.println("Thankyou! Have a good day!");
                 else if (input != null) 
                        try 
                                String numbers;
                                numbers = input.replaceAll("[^0-9]", "");
                                int number = Integer.parseInt(numbers);
                                out.println("The line is being printed");
                                for (int i = 0; i < number; i++) 
                                out.println(input.replaceAll("[^a-z,^A-Z]", ""));
                           
                
                catch (Exception e) 
                    e.printStackTrace();
                
            else 
        out.println("Sorry!");
                            
                        
                     catch (IOException e)  
                
            ;
            t.start();
        try 
            Thread.sleep(2000L);
        
        catch (InterruptedException xInterrupted) 
            // Ignore.
        
        
       

我在客户端添加一个输入,它从服务器获得响应,但是当我尝试插入另一个时,它变为空白,表明它不接受来自客户端的任何进一步输入。那么,有人能指出我在这段代码中哪里出错了吗?

【问题讨论】:

while(!"End".equals(input)) if 而不是while 吗?一旦进入该循环,它将永远不会停止,因为您不会更改循环体内的输入。因此,一旦条件为真,它将永远保持为真 @OHGODSPIDERS 你能指导我对代码进行哪些更改,就像你说的那样,而不是 while 循环,我应该使用 if,但是在哪里,以及它里面的什么条件 @OHGODSPIDERS 如果我使用“if”而不是 while,它不会为服务器端的最后一个 else if 条件提供正确的输出结果。 【参考方案1】:

您可能陷入了嵌套的 while 循环。输入在嵌套的 while 循环内永远不会改变,所以你永远不会逃脱。

    while (true) 
        System.out.print("Input: ");
        String input = s.nextLine();
        System.out.println("Sent: " + input);
        out.println(input);

        while(!"End".equals(input))  // <-- Why the while loop?
                System.out.println("Echoed from server: " + in.nextLine());
            
    

修复它的一个方法是用这个替换 while(true) 循环:

    System.out.print("Input: ");
    String input = s.nextLine();
    while (!"End".equals(input)) 
        System.out.println("Sent: " + input);
        out.println(input);
        System.out.println("Echoed from server: " + in.nextLine());


        System.out.print("Input: ");
        String input = s.nextLine();
    

【讨论】:

我试过这段代码,但它没有按我要求的方式工作。

以上是关于为啥客户端不能一次又一次地获取输入;它只是在一个输入和一个来自服务器的响应后变为空白?的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 一次又一次地将数据添加到数据库中

为啥Android系统一次又一次将相同的内容绘制到画布上

使用循环一次又一次地迭代

如何使整个应用程序上的反应可用,而无需在每个 jsx 文件中一次又一次地导入它[重复]

Push sharp:一次又一次地发送相同的消息

一次又一次地改变一个 div 内容而不丢失以前的 html