【问题标题】:How to use socket to send and receive message from server?如何使用套接字发送和接收来自服务器的消息?
【发布时间】:2017-12-20 05:17:23
【问题描述】:

大家好,我有一个任务,我想向服务器发送消息,然后得到回复。我不断收到failed 1recvfrom failed: EBADF (Bad file descriptor) 错误,而且我是这个套接字的新手。希望有人可以帮助我。这是我的异步任务:

 private class SendDataAsyncTask extends AsyncTask<Void,Void,Void>
    {
        private String reply = "";
        @Override
        protected Void doInBackground(Void... params)
        {
            try {
                Socket socket = new Socket("ip",portNumber);
                PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
                //printWriter.write("hello there");

                printWriter.println("hello there");
                bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                printWriter.flush();
                reply = bufferedReader.readLine();
                if(reply != null && !reply.equals(""))
                {
                    Log.d(SOCKET_TESTING_TAG,"my message is " + reply);
                }
                else
                {
                    Log.d(SOCKET_TESTING_TAG,"no message yet");
                }
                Log.d(SOCKET_TESTING_TAG,"break 3");
                printWriter.close();

            }
            catch (IOException e)
            {
                Log.d(SOCKET_TESTING_TAG,"failed " + e.getMessage());
                e.printStackTrace();
            }
            return null;
        }
        @Override
        public void onPostExecute(Void var)
        {
            tv_response.setText(reply);
        }
    }
  • 注意:当我在 printWriter.flush() 之前放置 if 语句来检查 null readline 时,我仍然收到错误。

【问题讨论】:

    标签: java android sockets tcp server


    【解决方案1】:
    printWriter.close();
    

    关闭套接字的输入或输出流会关闭另一个流和套接字。删除这两个匹配项。

    if(bufferedReader.readLine() != null)
    

    这没有意义。如果它不为空,您将丢弃该行,然后读取下一行。您需要将结果存储到变量中。

    您可能需要使用printWriter.println() 而不是printWriter.write()。可能对等方也在读取行,而您没有发送行(没有行终止符)。

    如果reply == null 表示对端已关闭连接。不是“还没有消息”。空字符串可能是协议错误,但也不是“还没有消息”。

    【讨论】:

    • 我更新了问题中的代码。我将 bufferedReader.readLine() 存储在 reply 变量中。但是,我设置回复变量后的 LOG 语句没有运行,我不明白为什么,我希望我写对了。
    • 您可能需要使用printWriter.println() 而不是printWriter.write()。可能对方也在读行,而你没有发送。
    • printWriter 没有我在我的 android studio 编译器上看到的 println() 方法。当你说“同行也在阅读线路,而不是发送线路”时,我不明白。你能澄清一下吗?
    • Oh yes it does. 行由行终止符终止,您没有发送一个,并且您没有(现在)关闭套接字,因此对等方的 readLine() 会阻塞永远,这正是正在发生的事情。并且请注意,您需要在阅读之前将其冲洗干净。
    • 哦,成功了!感谢那。那么你能解释一下 flush 的作用以及为什么它需要在 readLine() 之前出现吗?
    猜你喜欢
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多