当前位置: 首页 > 知识库问答 >
问题:

javasystem.in可以在不使用线程的情况下同时与输入源代码一起工作吗?

鞠安民
2023-03-14

说我的要求是:要么用户在控制台中输入东西(从system.in),要么套接字接收东西,继续下一步。

所以我有一个扫描仪

Scanner sc = new Scanner(System.in);

有一个 Udp 客户端。(不同的输入源)

DatagramSocket clientSocket = new DatagramSocket();

我的代码是

while (true) {
     if (sc.hasNext()) {
        String str = sc.next();
        proceed(str)
     } else { 
        clientSocket.receive(pack);
        proceed(pack)
     }
}

显然这段代码是行不通的。因为当检查sc.hasNext()时,java正在等待用户在控制台中键入一些输入。目前我能做的是为Udp客户端打开一个线程。如果我改变顺序,

while (true) {
         clientSocket.receive(pack);
         if (not receive)  read from system.in
    }

这没有意义,因为receive()将一直等待util接收某些内容,所以它永远不会从系统中读取。同时。

那么,我如何在不使用线程的情况下实现我的需求呢?

受到@Andriy Kryvtsun的回答的启发,我做了一个快速测试。正如他所说,这是在某种程度上使用非阻塞读取,并不断让套接字超时,来模拟

        InputStream ins = System.in;
    byte buffer[] = new byte[512];
    BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
    DatagramSocket clientSocket = new DatagramSocket();
    System.out.println("From buffer:" + clientSocket.getLocalPort());

    while (true) {
        try {
            if (ins.available() > 0) {
                String line = reader.readLine();
                System.out.println("Read:" + line);
            } else {

                DatagramPacket pack = new DatagramPacket(buffer,buffer.length);
                clientSocket.setSoTimeout(2000);
                clientSocket.receive(pack);
                System.out.println("Receive: " + new String(pack.getData()));
            }
        } catch (IOException e1) {

        }
    }

共有1个答案

薛霄
2023-03-14

在使用阻塞Scanner#hasNext()调用之前,使用解封方法调用InputStream#可用()以获取信息是否已准备好读取。

此外,您还可以在调用阻塞接收(DatagramPacket p)方法之前调用DatagramSocket#setSoTimeout(int timeout)。因此,您可以在模拟解除阻塞读取的超时周期之后,打破receivemethod内的无限等待。

 类似资料:
  • 问题内容: 我正在评估JOOQ是否可在仍在开发中的新系统中使用。我想避免在与应用程序一起开发数据库时生成代码,而只是为该应用程序起持久存储的作用。因此,预计数据库模式定义将由Java代码(java中的表定义)驱动。 JOOQ是否适合上述用例?是否有用于模式定义的Java DSL? 问题答案: JOOQ是否适合上述用例? 是的,许多jOOQ用户仅使用运行时库,而没有代码生成器。入门指南中提供了示例。

  • 我正在评估JOOQ在一个仍在开发中的新系统中的使用情况。当数据库与应用程序一起开发时,我希望避免代码生成,而只是在这个应用程序中扮演持久存储的角色。因此,数据库模式定义应该由Java代码(Java中的表定义)驱动。 JOOQ是否适用于上述用例?是否有用于模式定义的JavaDSL?

  • 问题内容: 我有PK,它是自增密钥。我需要将记录插入数据库中,然后取回该PK并在另一个插入中使用它。 但是,我想在一次交易中做到这一点。那可能吗。这样的想法是,如果我必须执行的任何更新/插入都失败了,那么我可以回滚所有内容,但是我的印象是我需要进行一次提交。 我本来打算先在ado.net上执行此操作,然后切换到存储过程,因为我认为这可能会解决此问题。 SP在这种情况下会帮助我吗? 问题答案: 是的

  • 问题内容: 我正在使用nodejs和expressjs框架从服务器下载文件’jsonFile.json’。 我正在使用以下代码 但这会导致对整个文件内容的响应。 我期望浏览器要我将文件保存在本地磁盘中。 如何将文件保存在本地磁盘中? 问题答案: 让Express设置正确的标头,然后执行以下操作: (doc) 编辑: 由于您是通过AJAX调用进行请求的,因此您必须更改设置,因为大多数(全部?)浏览器

  • 目前,我正在研究一个考勤应用程序的可行性,该应用程序具有为Android和iOS编写的以下功能。iOS-不能自动化。每次点击标签时,它都需要用户输入或单击。 然而,我没有很多关于Android NFC功能的谷歌搜索结果。我想在我的考勤应用程序中使用以下功能。 > 将员工ID写入标记或在员工记录中记录标记标识符(使用第三方应用程序) 考勤应用程序将安装和设置在Android手机上,并保存在塑料盒(考

  • 尝试使用Request.GetParameter但结果检索到第一个值,即第一个索引: 将名称取为“MyArray[]”,并在下一页使用 访问该值` 现在我应该做什么,有没有替代方法或者要在这里做一些更改: 这是page One.jsp中的表单: 下面是代码片段: 注意:忽略计数器值,因为这里只是为了检查,代码运行正常,但它只使用Request.GetParameter检索第一个索引值。 请给我一些