【问题标题】:Android Java - Two socketmessages when sending oneAndroid Java - 发送一个时有两个套接字消息
【发布时间】:2013-10-18 17:45:57
【问题描述】:

我通过套接字从 android 应用程序向 java 程序发送消息。此消息由打印机发送。

这是我如何将消息从 android 发送到 java 程序:

out.println("Hello there");
out.flush();

这是我收到消息的方式:

while(true){
String msg = in.readLine();

System.out.println("MSG: " + msg);

...some if-statements...
}

System.out.println 的输出是: 味精:你好 *味精:空*

我怎么会在那里得到 null ?我只是发送“你好”..

我们将不胜感激,谢谢!

编辑: java 程序的实际代码。

while (run) {
            String msg = in.readLine();
            String[] parts;  
            String username;
            String password = null;

            System.out.println("MSG: " + msg);

            parts = msg.split("\\*");
            username = parts[0];
            password = parts[1];

            boolean validUser = false;

            validUser = db.authenticate(username, password);

            if (validUser) {
                        db.updateIP(username,                     socket.getInetAddress().getHostAddress());
                        out.println("done");
                        out.flush();
            } else {
                        out.println("loginfail");
                        out.flush();
                        closeSocketConnection();
                }
            }
        }

    private void closeSocketConnection() throws IOException {
        in.close();
        out.close();
        socket.close();
        run = false;
    }

【问题讨论】:

  • 如果输入字符串是"Hello world",我希望password = parts[1]; 会抛出IndexOutOfBoundsException
  • run 定义在哪里。包含while 循环的整个函数是什么?
  • 好的,我知道我很抱歉我不是很清楚。 “Hello world”只是我第一个伪代码中的一个例子。现在我发送“user*123”并得到 MSG:user*123 MSG:null。 while-loop 被放置在一个 Handler(它扩展了线程)中,而 run 变量被定义在 while-loop 之外但在 Handler 类中。
  • 就 SO 提出问题时,您必须清楚。伪代码和不相关的示例输入不起作用,尤其是当它不能代表您遇到问题的情况时。

标签: java android sockets inputstream outputstream


【解决方案1】:

while 循环的退出条件是什么?

在我看来它正在重复,当到达流的末尾时 readLine 将返回 null,从而导致打印 MSG: null

根据新信息更新:

假设user*123 是一个有效的用户名/密码组合,则永远不会调用closeSocketConnection(),循环返回顶部,readLine 返回null,您会看到错误的输出。后跟NullPointerException parts = msg.split("\\*");

【讨论】:

  • 我的 wile-loop 将在一个 if 语句中停止,在该语句中我关闭了与 android 应用程序的整个套接字连接。此外,它不是真正的 while(true),而是一个布尔变量 run,当我在 if 语句中关闭连接时它变为 false。我怎样才能避免这个空值?
  • 请发布您正在使用的实际代码。调试我们看不到的代码并不容易。
【解决方案2】:

你的循环应该是:

while ((line = in.readLine()) != null)
{
    // ...
}

此时您正在处理表示循环内流结束的 null,因此您将其打印为消息,而不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 2016-08-31
    • 2012-03-25
    • 2019-07-04
    相关资源
    最近更新 更多