如何使用socket从服务器发送和接收消息?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用socket从服务器发送和接收消息?相关的知识,希望对你有一定的参考价值。

大家好,所以我有一个任务,我想在服务器上发送一条消息,然后回复。我一直得到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读取行时,我仍然会收到错误。
答案
printWriter.close();

关闭套接字的输入或输出流会关闭另一个流和套接字。删除两个事件。

if(bufferedReader.readLine() != null)

这没有意义。你抛弃了这条线,然后读取下一行,如果它不是空的话。您需要将结果存储到变量中。

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

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

以上是关于如何使用socket从服务器发送和接收消息?的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 客户端未从服务器接收消息

使用 Socket.Io 聊天应用程序 - 发送和接收消息之间的区别

java或者scala写socket客户端发送头消息和消息体到服务端并接收返回信息,这个头消息怎么写

linux下,socket服务器和客户端TCP方式建立了连接,如何使它们之间相互发送消息?

socket如何用多线程实现同时能接收和发送消息

当有多个服务器广播时,客户端如何接收多个广播消息?