Java - 从缓冲读取器(从套接字)读取正在暂停线程

2023-11-22

我有一个线程从缓冲读取器读取字符(从套接字创建,如下所示):

inputStream = new BufferedReader(new InputStreamReader(clientSock.getInputStream()));

这段代码只能运行一次。例如,如果客户端连接并发送以下内容: “这是一个测试”和“这是另一个测试”,主机输出是:

 Reading from stream:
 Chars read from stream: 16
 This is a test

 Reading from stream:

请注意,程序不会收到“这是另一个测试”,因为它停留在读取流上。有没有办法在不减少缓冲区大小的情况下处理这个问题? 这是线程的代码:

public void run() {
        boolean dataRecieved = false;
        char[] inputChars = new char[1024];
        int charsRead = 0;

        while (!stopNow) {

            try {
                Thread.sleep(getDataDelay);

                //Read 1024 characters. Note: This will pause the thread when stream is empty.
                System.out.println("Reading from stream:");
                charsRead =  inputStream.read(inputChars); //<< THIS LINE IS PAUSING THE THREAD!> 


                if ((charsRead =  inputStream.read(inputChars)) != -1)
                {
                    System.out.println("Chars read from stream: " + charsRead);  
                    System.out.println(inputChars);
                    System.out.flush();
                }


            } catch (IOException e) {
                System.out.println("IOException");
                //TODO: CLIENT HAS DISCONNECTED...
            } catch (InterruptedException e) {
                System.out.println("Interrupted");
                // Sleep was interrupted.
            } 

        }

    }

客户端/发送者的代码(不是我的代码):

public static void main(String[] args) throws IOException {
        // <<<<<<<<<<< CLIENT >>>>>>>>>>>>>>>

        Socket sock = new Socket("127.0.0.1", 3000);
        // reading from keyboard (keyRead object)
        BufferedReader keyRead = new BufferedReader(new InputStreamReader(System.in));
        // sending to client (pwrite object)
        OutputStream ostream = sock.getOutputStream(); 
        PrintWriter pwrite = new PrintWriter(ostream, true);

        // receiving from server ( receiveRead  object)
        InputStream istream = sock.getInputStream();
        BufferedReader receiveRead = new BufferedReader(new InputStreamReader(istream));

        System.out.println("Start the chitchat, type and press Enter key");

        String receiveMessage, sendMessage;               
        while(true)
        {
            sendMessage = keyRead.readLine();     // keyboard reading
            pwrite.println(sendMessage);       // sending to server
            System.out.flush();         // flush the data

            if((receiveMessage = receiveRead.readLine()) != null) //receive from server
            {
                System.out.println(receiveMessage); // displaying at DOS prompt
            }         
        }               
    }          

java.io.InputStream.read() is a blocking调用,这意味着如果没有可用数据,线程将暂停,直到数据可用。

对于非阻塞 I/O,请使用以下类java.nio包裹。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java - 从缓冲读取器(从套接字)读取正在暂停线程 的相关文章

随机推荐

  • TcpClient.Connected 返回 true 但客户端未连接,我可以使用什么代替?

    在 VB net 中 我使用 TcpClient 来检索数据字符串 我不断检查 Connected 属性以验证客户端是否已连接 但即使客户端断开连接 它仍然返回 true 我可以用什么来解决这个问题 这是我当前代码的精简版本 Dim cli
  • Aws Lambda 访问 META-INF/MANIFEST.MF?

    我习惯于在我构建的每个 jar 文件的 META INF MANIFEST MF 中填写与组件版本 构建时间等相关的信息 我希望我的 lambda 记录该信息和 或将其作为其输出的一部分 在大多数情况下 我可以使用类似于以下的代码来访问它
  • Antlr4 C# 目标和生成文件的输出路径

    我有一个带有 Antlr3 语法文件的 C 解决方案 我正在尝试升级到 Anltr4 事实证明语法是最简单的部分 它变得更好 大小也减少了三分之一 事实证明 生成解析器是棘手的部分 在旧的解决方案中 我只是在语法文件更改时运行 AntlrW
  • 如何设置 Scala 2.10 并行集合的默认线程数?

    在 2 10 之前的 Scala 中 我可以在 defaultForkJoinPool 中设置并行度 如这个答案scala并行集合的并行度 在 Scala 2 10 中 该 API 不再存在 有据可查的是 我们可以在单个集合上设置并行性 h
  • Java 正则表达式不匹配

    我知道这类问题经常被提出 但是 我不明白为什么这个正则表达式不匹配 我想检查该行的开头是否有 M 最后 我想要该行末尾的路径 这就是startsWith 不符合我的需要的原因 line M 72208 70779 koj src com c
  • 当我打开检查元素时,谷歌地图未完全加载,它将起作用

    我在我的网站上集成了谷歌地图 但是当我打开时 检查元素地图将起作用 当我关闭时 地图将消失 请让我知道问题出在哪里 before 打开后检查元素 代码在这里
  • 两个关系的(De)标准化

    读过C J Date的Introduction to Database System或类似水平书籍的人应该不会对规范化和非规范化的定义有任何疑问 然而 记忆已经不再是以前的样子了 我发现自己经常看着一些设计 并说它没有标准化 尽管我找不到它
  • 从列表中删除空字符串

    我刚刚开始学习 Python 课程 我确实需要一些帮助 如果您回答这个问题 请记住我是新人 我必须编写一个程序 取某个列表 l 中所有元素的平均值 这本身就是一个非常简单的功能 问题是老师希望我们在求平均值之前删除列表中存在的任何空字符串
  • 检测宏参数是否是类型名

    在 C11 gnuC11 中 如果宏参数是或不是类型名称 或者至少宏可以区分整数常量表达式和类型名称 即 如果可以检测到参数不是其中之一 则可以假设它是另一个 define IS TYPENAME X Static assert IS TY
  • Android 中定期从服务器获取数据(轮询)

    我正在开发一个应用程序 我使用休息调用从服务器获取数据并将其添加到视图中 我正确地获得了所有初始数据 我使用 AsyncTask 来做这件事 现在我想定期 比如2分钟 从服务器获取新数据并将其添加到视图中 在Android中定期从服务器获取
  • 如何将字典的键值对打印为对齐表?

    Student Name Mathematics 90 Computer Science 100 Chemistry 90 Physics 97 English 95 for key value in Student Name items
  • Angular 5 生产构建抛出错误

    我有一个使用版本 5 2 的角度应用程序 在构建生产时抛出以下错误 在本地运行应用程序或运行标准构建时不会抛出错误 必须指定路由或分析模块中的错误 经过研究 错误是由提前编译器抛出的 但我不确定是什么原因导致的 如果有人提出在哪里查看的建议
  • 如何在 Chrome 中分析网络工作者?

    有谁知道在 Chrome 中分析网络工作者的简单方法吗 我发现这个问题从去年开始 但不幸的是 唯一提供的答案不起作用 有什么办法可以做到这一点还是我只是看起来不好看 如果您甚至无法进行分析 这似乎是一个相当大的疏忽 会阻碍 Web 开发 要
  • 根据文本框的输入动态显示/隐藏div

    我正在一个网站上工作 我有一个页面 其中包含这样构建的人员列表 div class personsMenu div class person div class name John div div class age 18 div div
  • Symfony2 错误:加载的类名和声明的类名之间大小写不匹配:

    我正在 Symfony2 上工作 我更新了我的项目composer phar update 现在 当我检查我的网站时app dev php我总是有这个错误 Case mismatch between loaded and declared
  • 在数组中找到一个对象?

    Swift 有类似的东西吗 findWhere在Underscore js 中 我有一个类型的结构数组T并想检查数组是否包含一个结构对象 其name财产等于Foo 尝试使用find and filter 但它们只适用于原始类型 例如Stri
  • 使用常规迭代器向后迭代,还是与反向迭代器作斗争?

    我最近了解了在 C 中使用反向迭代器的正确方法 特别是当您需要擦除迭代器时 看这个问题 and this one 这就是你应该这样做的方式 typedef std vector
  • 方案中定义表达式的类型

    简单地说 我的问题是Scheme中定义表达式的类型是什么 举个例子 define x 5 or define x lambda n n n 这对我来说有点混乱 有人可以帮忙吗 球拍内define是一种特殊形式而不是表达式 因此它本身没有值
  • 屏幕上的客户端矩形坐标

    如何获取窗口客户区相对于屏幕的坐标 我想过使用GetClientRect and ClientToScreen 另外 在浏览器窗口中是什么ClientRect 仅有矩形HTML其中显示的文档 或者它包括浏览器栏和弹出菜单 这可能会缩小尺寸H
  • Java - 从缓冲读取器(从套接字)读取正在暂停线程

    我有一个线程从缓冲读取器读取字符 从套接字创建 如下所示 inputStream new BufferedReader new InputStreamReader clientSock getInputStream 这段代码只能运行一次 例