大家好,所以我有一个任务,我想把一条消息发送到服务器,然后得到回复。我一直收到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语句检查空读取行时,我仍然会收到错误。答案 0 :(得分:1)
printWriter.close();
关闭套接字的输入或输出流会关闭另一个流和套接字。删除两次出现。
if(bufferedReader.readLine() != null)
这没有意义。如果它不是空的话,你就扔掉线然后读下一行。您需要将结果存储到变量中。
您可能需要使用printWriter.println()
代替printWriter.write()
。对等人也可能正在读取行,你也不会发送行(没有行终止符)。
如果reply == null
,则表示对等方已关闭连接。尚未发送消息&#39;。空字符串可能是协议错误,但它还没有“消息”#。