当前位置: 首页 > 面试题库 >

套接字多线程-读取输入流会使线程暂停

邹京
2023-03-14
问题内容

我正在测试本地计算机上的套接字。我正在尝试使用线程在一个程序中同时运行套接字和服务器。我的服务器是回显服务器,因此它可以将收到的所有消息发回。我的问题是,当我同时在客户端和服务器上启动两个线程时,当它们到达我从输入流读取的部分时,它们将“冻结”。它可以很好地工作到客户端发送消息的那部分。然后,它停止了,因为似乎客户端正在等待消息,服务器也是如此,即使我已经通过写入输出流向服务器发送了消息。代码有什么问题?

客户端程序

@Override
    public void run() {

        try {
            Socket socket = new Socket("localhost", 22600);

            BufferedReader br = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                    socket.getOutputStream()));
            BufferedReader input = new BufferedReader(new InputStreamReader(
                    System.in));
            System.out.println("Client 1");

            while (true) {

                System.out.print("\nEnter text : ");
                String inputText = input.readLine();
                writer.write(inputText);
                System.out.println("Client 2");

                System.out.println("Client 3");
                String s = br.readLine();
                System.out.println("CLIENT RECEIVED : " + s);

            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

服务器.java

@Override
public void run() {

    try {
        ServerSocket server = new ServerSocket(22600);
        Socket socket = server.accept();
        BufferedReader br = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                socket.getOutputStream()));


        System.out.println("Server 1");
        while (true) {

            System.out.println("Server 2");
            String s = br.readLine();
            System.out.println("Server 3");
            if (s == null) {
                System.out.println("NULL SERVER SIDE ERROR");
                break;
            }

            writer.write("ECHO : " + s);
            System.out.println("SYSOUT ECHO " + s);

        }
        server.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

问题答案:

您正在写的字符串的末尾没有行尾。

            String inputText = input.readLine();
            writer.write(inputText);
            System.out.println("Client 2");

inputText字符串不包括您键入的行尾。然后将其原样写入服务器。但是,服务器尝试读取一行:

        String s = br.readLine();
        System.out.println("Server 3");

因此它将一直等待,直到客户端发送换行符。但是到目前为止,客户端正在等待服务器的答复,现在它们已陷入僵局。

因此,您应该writer.newLine()向客户端以及服务器的回显添加a
,这也会遇到相同的问题。每次写入后,还建议writer.flush()在服务器和客户端上都使用。否则,它可能要等到缓冲区已满后才能进行实际写入,并且将导致相同的死锁。



 类似资料:
  • 我正在编写一个简单的套接字编程应用程序,它使用一台服务器和一个客户端。我试图启动一个线程(从客户端文件中),从套接字输入流中读取输入,这样我就可以将消息写入服务器,同时读取并打印到屏幕上。然而,当我运行我的代码时,我的代码卡在 在< code>InputReader.java文件中,读取无输入? 我的代码如下,请帮忙。 简单服务器1.java SimpleClient1.java 输入读取器.ja

  • 我正在开发一个应用程序(控制台),其中包含一个while循环,我希望允许用户暂停和恢复。经过一些研究,似乎一个额外的线程负责等待用户输入是正确的解决方案。 我已经能够实现持续等待输入的额外线程,并且还有一个kill方法,它设置flag变量来停止线程while()循环。不幸的是,除非有输入,否则while循环不会结束,只有在输入线程的while环至少完成一次后,这个kill标志才会生效。由于主线程也

  • 问题内容: 我有一个线程可以从缓冲读取器读取字符(该读取器是从套接字创建的,如下所示): 此代码只能运行一次。例如,如果客户端连接并发送此消息:“这是一个测试”和“这是另一个测试”,则主机输出为: 请注意该程序不会收到“这是另一个测试”,因为它停留在读取流上。有什么办法在不减小缓冲区大小的情况下解决这个问题?这是线程的代码: 客户/发送者的代码(不是我的代码): 问题答案: 是一个 阻塞 调用,这

  • 这是我的客户端和服务器的代码。 class Client1{Client1(int no){try{String message;message=“Hello this is client”+no;byte[]b=message.getBytes();DatagramPacket dp=new DatagramPacket(b,b length,inetAddress.getLocalHost()

  • 我有一个类似的问题,但是我知道当我要求阅读一行时,发件人应该发送一个行尾。 让我困惑的是,在调试中,它是有效的。可能是因为我在调试时跳过的顺序(直到现在我都不知道这会有什么不同),但我想更好地理解它。 我已经使用线程,但不是很多。 这是我的服务器类: 线程(基于此) 和客户: 它似乎在某个地方进入了死锁,出于某种原因,除非在调试中运行,否则永远不要在向客户端发送数据的服务器类上输入该死锁 (顺便说

  • 我对套接字和以这种方式使用线程相当陌生。 我遇到了一个问题,一个扫描器在等待用户输入,一个输入流阅读器在等待套接字通信。我的程序试图与客户机/服务器系统通信,这很好,但我也希望能够通过扫描仪或类似的东西直接将命令输入控制台。但是,主线程的while循环阻塞了套接字通信,而扫描器阻塞了InputThread的while循环。 我的问题是,如果我在控制台中发送命令关闭服务器(将布尔'running'设