【问题标题】:Java sockets: How to display message in DataInputStream only onceJava 套接字:如何在 DataInputStream 中只显示一次消息
【发布时间】:2017-02-26 21:55:57
【问题描述】:

我已经编写了一个类,它已经允许我使用套接字连接 2 个设备,我还实现了让彼此发送消息的能力。我收到带有 DataInputStream 的消息,它在 while(true){} 循环中不断检查消息。我记录了这些消息,但它们向整个控制台发送了垃圾邮件。所以我添加了一个名为 lastMsg 的变量,它检查当前消息是否是最后收到的消息,如果是,则不会打印该消息,因此该消息只会记录一次。问题是当用户发送两条相同的消息时,显然只有第一条会被记录。

那么有没有其他方法可以检查消息是否被发送了两次,或者消息是否与几秒钟前发送的消息相同?

我的代码来检查收到的消息:

 public void run() {
            Socket other = new Socket();
            try {
            other.connect(new InetSocketAddress("xxxxxx", xxxx), 1000);
            log("Connected to host");
            while (true) {

                DataInputStream in = new DataInputStream(other.getInputStream());
                String msg = in.readUTF();
                if(!lastClientMsg.equals(msg)){
                    log("[HOST-MSG] "+msg);
                    lastClientMsg = msg;
                }


            }
                } catch (IOException e) {
                log("Error at creating client: "+e.toString());
            }

        }

【问题讨论】:

  • 嗯?当前消息如何不是是最新消息?
  • 为什么会重复。这是一个 tcp 连接,一旦你从流中读取,消息就消失了。如果您在谈论消息内容,那么您正在做的事情很好。您的方法还有一个问题是在每个循环中创建一个 DataInputStream 。这不是一个好主意,一旦你得到输入流,就是这样。您的无限循环应该在读取该流和缓冲区。我假设您有一种识别完整消息的方法。流的内容可以部分拆分和读取。
  • 已修复,谢谢告知。

标签: java sockets datainputstream


【解决方案1】:

尝试使用集合对象来存储最近 20 条消息。 ArrayList 会做得很好。检查最后 20 条消息并删除每条新消息中的第一条并将新消息添加到集合中。

祝你好运。

【讨论】:

    【解决方案2】:

    使用DataInputStream.readUTF() 方法应该将消息从输入缓冲区移动到字符串变量,但由于某种原因缓冲区没有被清除。一些提示:

    • 尝试将DataInputStream 声明移到while 循环之外。每次检查消息时都声明它可能是您的问题。
    • 确保发送消息的代码只发送一次。如果它被循环发送,它会阻塞你的输入流。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      相关资源
      最近更新 更多