【问题标题】:My application gets stuck on mBufferIn.readLine()我的应用程序卡在 mBufferIn.readLine()
【发布时间】:2017-04-09 09:32:04
【问题描述】:

我一直在尝试将消息从服​​务器发送到我的应用程序。我正在使用应用程序“Simple Socket Tester”来创建服务器并将 UTF-8 消息发送到应用程序。我从来没有在我的应用程序上收到消息,当我调试应用程序时,它卡在“mServerMessage= mBufferIn.readLine();”行上并且永远不会过去。所以它似乎无法阅读该消息。当我暂停调试器时,我来到“LocalSocketImpl.java”,它卡在“私有本机 FileDescriptor 接受”上。我能做些什么来防止这种情况发生?

我的 TCP 客户端:

public TcpClient(OnMessageReceived listener) {
    mMessageListener = listener;

}

/**
 * Sends the message entered by client to the server
 *
 * @param message text entered by client
 */
public void sendMessage(String message) {
    if (mBufferOut != null && !mBufferOut.checkError()) {
        mBufferOut.println(message);
        mBufferOut.flush();
    }
}


/**
 * Close the connection and release the members
 */
public void stopClient() {

    mRun = false;

    if (mBufferOut != null) {
        mBufferOut.flush();
        mBufferOut.close();
    }

    mMessageListener = null;
    mBufferIn = null;
    mBufferOut = null;
    mServerMessage = null;
}

public void run() {

    mRun = true;

    try {
        //here you must put your computer's IP address.
        InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

        Log.e("TCP Client", "C: Connecting...");

        //create a socket to make the connection with the server
        Socket socket = new Socket(serverAddr, SERVER_PORT);

        try {

            //sends the message to the server
            mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
            sendMessage("hi");

            //receives the message which the server sends back
            mBufferIn = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));



            //in this while the client listens for the messages sent by the server
            while (mRun) {

                mServerMessage = mBufferIn.readLine();
                System.out.println(mServerMessage);

                if (mServerMessage != null && mMessageListener != null) {
                    //call the method messageReceived from MyActivity class
                    mMessageListener.messageReceived(mServerMessage);
                }

            }

            Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + mServerMessage + "'");

        } catch (Exception e) {

            Log.e("TCP", "S: Error", e);

        } finally {
            //the socket must be closed. It is not possible to reconnect to this socket
            // after it is closed, which means a new socket instance has to be created.
        }

    } catch (Exception e) {

        Log.e("TCP", "C: Error", e);

    }

}

//Declare the interface. The method messageReceived(String message) will must be implemented in the MyActivity
//class at on asynckTask doInBackground
public interface OnMessageReceived {
    public void messageReceived(String message);
}

}

【问题讨论】:

  • 你从服务器发送什么到客户端?服务器是否应该回复客户端发送的“hi”?
  • 不,“嗨”只是为了看看我是否设法向服务器发送了一些东西。
  • 我确实修复了它,我看到了你的最后一条评论,这实际上是问题所在。我添加了一个 \n ,现在它可以工作了。所以谢谢你!
  • 我之前的答案没有被删除,请问您可以将其标记为正确吗?

标签: java sockets tcp bufferedreader tcpclient


【解决方案1】:

您收到的字符串末尾必须有 '\n'。 readLine 方法将停止读取或等待流,直到它读取到 '\n'。

【讨论】:

  • 你知道是否有一种方法可以读取不以换行符结尾的数据吗?像 readLine() 之外的另一个命令?
  • 我推荐你在这个answer上排名第八。
  • 感谢您的帮助,但我现在意识到我认为这行不通。这是因为服务器发送了我必须解析的 JSON 对象。很抱歉给您提了很多问题,但您不知道该怎么做?
  • 正在发送的数据如下所示:{"d":{temp_mC";33416,"h​​umidity_ppm"...more data....}}
  • 执行我之前评论的方法获取json字符串。然后使用 jsonsimple 之类的 json 库来解析它。这是一个article,它可能会帮助您选择一个 json 库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多