套接字流无法刷新

时间:2014-09-21 16:54:28

标签: java android multithreading sockets

我正在为Android 4.2编写一个应用程序,目前在三星s2 +上进行了调试。 应用程序使用Socket建立与服务器的连接,服务器使用ServerSocketestablish() - 方法获取其套接字。到现在为止还挺好。由于我必须在一个新线程中在android中创建所有网络,我创建了一个扩展Thread的新类,它使用Activity与基础BlockingQueue(用户输入)进行通信。线程运行方法:

public void run() {
    Socket s = null;
    try {
        s = new Socket(info.getIp(), 1337);
    } catch (IOException e) {
        e.printStackTrace();
    }

    String code = null;
    try {
        code = queue.take();
    } catch (InterruptedException e1) {
        e1.printStackTrace();
    }

    Log.e("DONE", code);

    PrintWriter out = null;
    try {
        out = new PrintWriter(s.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
    out.write(code);
    out.flush();
}

连接已启动并正在运行,并且已记录的消息" DONE" +代码已被记录。但是,在我强制关闭应用程序之前,服务器端没有收到任何内容。 android线程是否无法刷新数据?

编辑:如果在写入后立即关闭套接字,则文本到达而不必强制关闭应用程序。如果套接字仍处于活动状态,为什么我无法读取服务器中的文本?

2 个答案:

答案 0 :(得分:1)

尝试在发送给服务器的字符串中添加换行符,例如:

out.write(code+"\n");
out.flush();

并且如上面的EJP所说,将out.write放在try / catch

答案 1 :(得分:0)

套接字连接仅提供发送和接收字节的功能。一旦客户端发送一个字节,服务器就会收到它。此外,一旦客户端断开连接,服务器就会知道它 - 这是关于从套接字获得的扩展。

此级别不存在消息的概念。消息由套接字上方的任何内容定义,因此大多数协议使用三种不同方式中的一种或多种来将字节流块化为"消息"

  • 一个特殊的字节或字节序列表示消息的结束(例如,一个新行,似乎是你的情况:)
  • 每条消息以x字节开头,提供消息的长度(因此简单的" 05aaaaa02bb"字节流可能意味着发送了2条消息 - " aaaaa"和&# 34; BB"
  • 整个套接字连接持续一条消息(当连接关闭时,消息结束)。这就是HTTP 1.0的工作原理。