需要帮助改进 java 客户端端口侦听器

2023-12-23

我有一小段代码在包含 SWING 控件的小程序中运行,用于将信息写入某个端口上的套接字,然后侦听响应。这工作得很好,但是有一个问题。端口侦听器本质上处于循环状态,直到服务器接收到 null。我希望用户在等待服务器响应时能够在小程序实例化的 GUI 中执行其他操作(这可能需要几分钟的时间)。我还需要担心服务器和客户端之间的连接断开。但按照代码的编写方式,小程序似乎会冻结(实际上是在循环中),直到服务器响应为止。我如何允许侦听器在后台进行侦听,从而允许程序中发生其他事情。我假设我需要使用线程,并且我确信对于这个应用程序来说,它很容易实现,但我缺乏坚实的线程基础阻碍了我。下面是代码(您可以看到它是多么简单)。我怎样才能改进它,让它做我需要它做的事情>

  public String writePacket(String packet) {
/* This method writes the packet to the port - established earlier */
   System.out.println("writing out this packet->"+packet+"<-");
   out.println(packet);
  String thePacket =    readPacket();  //where the port listener is invoked.  
   return thePacket;
   }
    private String readPacket() {
      String thePacket ="";
      String fromServer="";
      //Below is the loop that freezes everything.   
     try {
      while ((fromServer = in.readLine()) != null) { 
        if (thePacket.equals("")) thePacket = fromServer;
        else 
        thePacket = thePacket+newLine+fromServer;
    }
        return thePacket;  //when this happens, all listening should stop.   
   } catch (IOException e) {
        // TODO Auto-generated catch block
    e.printStackTrace();
    return null;
    }

     }  

Thanks,

Elliott


有很多不同的方法可以在不同的线程上执行 IO,但在这种情况下您可能想要使用摇摆工人 http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html.

你的代码看起来像这样:

private final Executor executor = Executors.newSingleThreadExecutor();

public void writePacket(final String packet) 
{
  // schedules execution on the single thread of the executor (so only one background operation can happen at once)
  //
  executor.execute(new SwingWorker<String, Void>()
      {

        @Override
        protected String doInBackground() throws Exception
        {
          // called on a background thread


          /* This method writes the packet to the port - established earlier */
          System.out.println("writing out this packet->"+packet+"<-");
          System.out.println(packet);
          String thePacket = readPacket();  //where the port listener is invoked.  
          return thePacket;            
        }

        @Override
        protected void done()
        {
          // called on the Swing event dispatch thread


          try
          {
            final String thePacket = get();

            // update GUI with 'thePacket'
          }
          catch (final InterruptedException e)
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
          catch (final ExecutionException e)
          {
            // TODO Auto-generated catch block
            e.printStackTrace();
          } 
        }
      });
}

private String readPacket() 
{
  String thePacket ="";
  String fromServer="";
  //Below is the loop that freezes everything.   
  try 
  {
    while ((fromServer = in.readLine()) != null) 
    { 
      if (thePacket.equals("")) 
        thePacket = fromServer;
      else 
        thePacket = thePacket+newLine+fromServer;
    }
    return thePacket;  //when this happens, all listening should stop.   
  } 
  catch (IOException e) 
  {
    e.printStackTrace();
    return null;
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要帮助改进 java 客户端端口侦听器 的相关文章

  • 两种方式通信服务器/客户端架构?

    我试图找出我们的新应用程序使用哪种客户端 服务器技术 即 NET Framework 的哪一部分 我们将使用 NET 3 5 SP1 用 C 编写应用程序 它将由一个作为 服务器 运行的中央服务和分布在多台计算机上的多个客户端应用程序组成
  • 抽象数据类型和接口

    抽象数据类型和接口有什么区别 例如我们有一个ListADT interface MyListADT
  • 项目展开时自动调整列大小

    在具有多列的树中 如何在展开 折叠和数据更新时调整列的大小以适应内容 类似的解决方案表格问题 https stackoverflow com questions 3186340 swt table auto resize all colum
  • JavaFX 控制器如何访问其他服务?

    我将 JavaFX 2 与 Scala 一起使用 我有class Application extends javafx application Application它执行诸如读取应用程序配置等操作 然后它会启动主窗口 该主窗口需要连接到一
  • 如何解决Spring Data JPA中的N+1问题?

    我使用 Spring Data JPA 作为持久层 并且面临 N 1 问题 我还使用规范 API 因为我发现很难解决 N 1 问题 请帮忙 Entity public class PopulationHealth Id private in
  • 克隆在幕后是如何工作的?

    克隆不会调用对象构造函数来创建对象的副本 那么clone使用什么算法呢 我正在寻找本机方法克隆的实现细节 任何指示将不胜感激 请注意 我知道克隆的缺点 protected native Object clone 我不太清楚 我需要查看本机代
  • JDK 11/JavaFX:如何在没有构建/依赖管理的情况下制作胖罐子?

    我认为不用说 我应该能够使用 Oracle 自己的 JDK 和 JavaFX 来自 gluonhq 来构建用户可以使用的可分发 jar 文件 经过详尽的搜索 大量阅读 过去几个月 24 小时或更长时间 最后是这个 Google 搜索查询 h
  • Jackson - 将值传递给 JsonDeserializer

    我有一个现有的类层次结构 如下所示 public interface Service String getId String getName public class FooTask extends AbstractTask private
  • 如何防止 Parallel.ForEach 循环在运行时更改任务数量?

    我正在使用Parallel ForEach循环做一些工作 我用localInit像这样 localInit gt new foo new Foo bars CreateBars 根据文档 https learn microsoft com
  • Java.lang.NoClassDefFoundError:com/fasterxml/jackson/databind/exc/InvalidDefinitionException

    我已经更新了我的依赖项 就像您在评论中所说的那样 我现在有这个 org springframework context ApplicationContextException Unable to start embedded contain
  • Groovy 2.0.1,我自己的类上有 GroovyCastException?

    我在我的网络应用程序项目中广泛使用 Groovy 类 我可以创建类型的实例 定义为 groovy 类 但以后永远不能转换回它 GroovyCastException发生 org codehaus groovy runtime typehan
  • 如何同时运行两个FOR循环

    我正在使用加速度计 第一个代码是振动检测器 代码1 if sensor SensorManager SENSOR ACCELEROMETER long curTime System currentTimeMillis long now Sy
  • Hibernate 时间戳 - 毫秒精度

    似乎以毫秒精度存储时间戳是休眠的一个已知问题 我在数据库中的字段最初设置为时间戳 3 但我也尝试过日期时间 3 不幸的是 它没有任何区别 我尝试过使用 Timestamp 和 Date 类 最近我开始使用 joda time 库 经过所有这
  • 减少最大值并保存其索引

    int v 10 2 9 1 3 5 7 1 2 0 0 int maximo 0 int b 0 int i pragma omp parallel for shared v private i reduction max maximo
  • 如何将一个组件放在其他组件之上?

    我有一个JScrollPanel其中包括一个大面板 其本身包括 3 个内面板 我想将一个面板 例如 放在一个特殊的位置 以便始终可以看到 我的意思是用户可以滚动到想要的任何地方 但该面板始终位于其他组件的顶部并且不会移动 我试图通过这样做J
  • 创建 FileInputStream 对象时使用 InputStream 而不是 FileInputStream 有什么区别

    这可能很愚蠢 但我想知道后台操作的区别 InputStream is new FileInputStream filepath FileInputStream is new FileInputStream filepath 上面两行代码有什
  • 从文件夹中读取java文件

    我开发了一个应用程序 可以从用户选择的文件夹中读取文件 它显示每个文件中有多少行代码 我只想在文件选择器中显示 Java 文件 具有 java 扩展名的文件 下面是我的代码 public static void main String ar
  • Java 8 LocalDate Jackson 格式

    For java util Date当我做 JsonFormat shape JsonFormat Shape STRING pattern dd MM yyyy private Date dateOfBirth 然后在我发送时在 JSON
  • 在多个线程中添加和删除时 List 中的 null 值

    我知道 C System Collections Generic List 对象不是线程安全的 但我想知道为什么这段代码会生成空值 Task Run gt for var i 0 i lt 10 i var str Test i list
  • Flask 从线程中删除会话变量

    我尝试实施投票系统 它的工作原理是这样的 如果用户对帖子进行投票 我会在会话变量中记录其临时状态 已投票 已加星标等 如果当前用户在我将结果保存到临时表之前尚未投票 用户可以在 5 分钟内更改投票 5 分钟后 结果将使用线程永久写入数据库

随机推荐

  • PhantomJS 打开一页又一页

    我使用此示例创建了 phantomjs 代码来登录网站 var page require webpage create page open http www facebook com login php function status if
  • 如何在 Material UI Grid 中具有不同的水平和垂直间距?

    在 Material UI 中 到空间Grid垂直项目 我提供了间距Grid容器 它在大屏幕上看起来不错 但在移动设备上 它会导致之间的水平间距尴尬Grid Items
  • android - 如何使用 ImageCropper.Forms 拍照和裁剪?

    我会在这里寻求任何帮助 我正在使用 xamarin 并且想要 点击按钮 开放式摄像头 拍照 裁剪照片 在图库中创建文件夹 将裁剪后的照片保存到图库中的新文件夹中 我正在遵循教程 Ref https github com stormlion2
  • 如何在javascript中获取频率值?

    我是一名意大利学生 我正在使用 p5 的库来创建一个网络吉他调音器 我想知道是否有办法获取麦克风输入的频率 图书馆链接 https p5js org reference libraries p5 sound https p5js org r
  • 如何比较 postgres 策略中行的旧值和新值以进行更新

    我有一个权限结构 因此特定权限仅允许编辑表中 5 个字段中的 2 个 我的整个系统中有 RLS 因此我需要在策略内执行上述操作 起初 我想到编写一个函数来检查用户是否更新了他们没有更新权限的字段 并在策略中使用它的返回值 但我找不到一种无需
  • 从文件中删除由具有特定关键字的白线分隔的一组行

    我有一个包含如下行的文件 如果一组行中的任何行包含关键字 SEDS2 TOP 我想从文件中删除一组行 每组行由空行分隔 0 00 600 00 2214 28 785 71 1 00000 SEDS1 BOTTOM 0 00 600 00
  • 固定长度的Javascript画布曲线

    我想绘制任何 随机 曲线 给定 起点 终点 曲线长度 我怎么能做这样的事情受限于画布边界 加上曲线不能交叉 我试图找到一些解决方案 但我无法弄清楚 谢谢你的时间 这是我想要完成的更详细的视图 这是在画布上绘制的二次曲线 一切安好 问题是 如
  • MVC3 的当前上下文中不存在名称“model”

    我在项目中添加了一个cshtml页面 当我尝试向其中添加以下声明时 出现错误 当前上下文中不存在名称 模型 model xyz abc SomeClass 我检查了参考文献 所有这些都已就位 我在视图文件夹中添加了 web config 但
  • 如何修复错误“正在更新 Maven 项目”。不支持 IClasspathEntry kind=4?

    我已经在 STS 中导入了 Maven 项目 当我运行更新更新项目时 我收到 Updating Maven Project Unsupported IClasspathEntry kind 4 有解决方法吗 此问题已在 m2e 1 5 0
  • 使用 pyodbc 将参数传递给 sql 查询失败

    我已经阅读了数十篇类似的文章并尝试了所有方法 但在尝试使用 pyodbc 将参数传递给简单查询时仍然收到错误消息 如果其他地方有答案但我找不到它 我们深表歉意 我有一个非常简单的表 select from Test yields a b c
  • 错误:“在包含外部引用的聚合表达式中指定了多个列。”

    我在尝试执行下面的查询时收到此错误 有什么想法或建议吗 Error 在包含外部引用的聚合表达式中指定多个列 如果正在聚合的表达式包含外部引用 则该外部引用必须是表达式中引用的唯一列 SELECT TestInstances pkTestIn
  • 为什么 JSLint 抱怨:“someFunction() 在定义之前就被使用了”?

    搜索 JSLint 错误 在定义之前使用 我发现了这些 JSLint 在定义错误之前使用函数 https stackoverflow com questions 806163 jslint using a function before i
  • 为什么网站为 url 生成随机字母数字字符串而不是使用行 ID?

    为什么许多网站 youtube 就是一个很好的例子 生成随机数字和字母的字符串 而不是使用行 ID 等 通常是这样的 bla v wli4l73Chc0 而不是喜欢 bla id 83934 如果你有很多行 只是为了保持简短吗 或者这还有其
  • Mac 上的 EWS 请求未响应并出现错误

    在我们的 Outlook 加载项中 我们使用makeEwsRequestAsync获取当前电子邮件MimeContent 我们了解通过 JavaScript API 使用 EWS 时存在 1MB 请求 响应限制 当我们在 Windows 上
  • 统计excel中某个月份的所有记录

    我有一张按日期组织的 Excel 培训表 我正在尝试制作每月统计报告 因此 我想通过Excel公式统计统计列标题中指定的月份内完成的培训次数 标题具有数字格式的月份 培训表中的日期采用 01 23 2015 格式 例如 如果统计列的标题为
  • sql server 自动每日表分区

    我需要重新设计一个包含每日日志且有数亿行的表 其概念是仅将数据保留一个月 该表将每天进行分区 使用日期时间字段作为分区键 例如 3 月份我需要 31 个文件组和 31 个分区 一旦进入 4 月 该过程将必须插入 4 月 1 日的分区并删除
  • 通过 SQL 根据日期合并(串联)行

    我有下表 Animal Vaccine Date Vaccine Dog 1 1 2016 x Dog 2 1 2016 y Dog 2 1 2016 z Cat 2 1 2016 y Cat 2 1 2016 z 我希望能够将同一动物和同
  • PHP 条件赋值

    在 Symfony 核心中发现一段有趣的代码 if host route gt getHost 的优先级高于 但它在逻辑上是如何工作的呢 第一部分很清楚 但其余部分呢 我创建了一个小样本 但仍然不清楚 sample http sandbox
  • 如何保存从 imagecreatefromstring() 函数创建的图像?

    这是我的代码 data iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB 2U7WAAAABl BMVEUAAAD l2Z dAAAASUlEQVR4XqWQUQoAIAxC2 0vXZDr EX4IJTRkb
  • 需要帮助改进 java 客户端端口侦听器

    我有一小段代码在包含 SWING 控件的小程序中运行 用于将信息写入某个端口上的套接字 然后侦听响应 这工作得很好 但是有一个问题 端口侦听器本质上处于循环状态 直到服务器接收到 null 我希望用户在等待服务器响应时能够在小程序实例化的