【问题标题】:readLine() from DataInputStream doesn't receive data correctlyDataInputStream 中的 readLine() 未正确接收数据
【发布时间】:2019-06-02 07:18:02
【问题描述】:

我是 Socket 操作的新手,我目前正在使用我的 Java 客户端与我的 C 服务器进行通信,但我在从我的服务器读取数据时遇到了一点问题。

当我启动我的服务器时,它会正确返回整个数据(我从我的 Java 客户端发送一个 SQL 请求,但每当我尝试使用 DataInputStream 从我的客户端读取它时。

当我启动它时,我基本上试图在我的应用程序的右侧显示用户名,向服务器发送一个 SQL 请求“SELECT username FROM username WHERE status='online'”,C 服务器发送一个响应: “青木 安托万"

当我尝试使用 readLine(); 读取数据时;在一段时间循环中,我只显示“Aoisuki”用户名。

我认为没有必要向您展示我的 C 服务器代码,因为我已经尝试过使用 C 客户端并且一切正常。

这是我来自客户端的 Java 代码:

public String recvMsg() throws IOException {
    s = new Socket(addr,port);
    din = new DataInputStream(s.getInputStream());
    d = new BufferedReader(new InputStreamReader(din));
    StringBuilder result = new StringBuilder();
    String tmp = "";
    try {
        while(((tmp=d.readLine())!=null)){
            result.append(tmp);
            d.wait();
        }
    } catch(Exception e){
       ....
    }
    return result.toString();
}

我已经尝试将“d.wait()”放在 while 循环之后,但我遇到了另一个问题:我的客户端在服务器关闭之前没有启动,但我同时显示了两个用户名(这就是我想要)

任何帮助将不胜感激。

【问题讨论】:

    标签: java tcp server client


    【解决方案1】:

    wait 方法是每个 java 对象的一部分。它是协同工作的 3 个独立事物的一部分:wait 方法、notify 方法和 synchronized 关键字。

    你不应该在这里调用它;没有理由在缓冲阅读器上调用它,你不应该在这里调用它。 d.readLine() 将阻止;您可以删除该行。

    【讨论】:

    • 我几乎 100% 确定我在没有 d.wait() 的情况下尝试过,我现在不知道,因为我不在家
    猜你喜欢
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    相关资源
    最近更新 更多