【问题标题】:Can't get TCP response in android无法在android中获得TCP响应
【发布时间】:2015-03-20 16:05:42
【问题描述】:

代码应该作为客户端连接到 TCP 服务器,发送命令并接收响应。

代码连接并发送命令,但在“socket.getInputStream()”处超时,即使连接的服务器收到命令并应该响应(使用 PC 上的 TCP 客户端程序检查) .

这是任务的代码:

public class MyClientTask extends AsyncTask<Void, Void, Void> {

    String dstAddress;
    int dstPort;
    String command;
    String response = "";

    MyClientTask(String addr, int port, String cmd){
        dstAddress = addr;
        dstPort = port;
        command = cmd;
    }

    @Override
    protected Void doInBackground(Void... arg0) {

        Socket socket = null;
        InputStream inputStream;

        try {
            socket = new Socket();
            socket.connect(new InetSocketAddress(dstAddress, dstPort),2000);
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);
            byte[] buffer = new byte[1024];
            int bytesRead;

            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
            out.println(command);

            inputStream = socket.getInputStream();
            socket.setSoTimeout(20000);
            while ((bytesRead = inputStream.read(buffer)) != -1){
                byteArrayOutputStream.write(buffer, 0, bytesRead);
                response += byteArrayOutputStream.toString("UTF-8");
            }

        }catch (UnknownHostException e){
            e.printStackTrace();
            response = "UnknownHostException: " + e.toString();
        } catch (IOException e) {
            e.printStackTrace();
            response = "IOException: " + e.toString();
        } catch (Throwable e) {
            e.printStackTrace();
            response = "Throwable: " + e.toString();
        }finally{
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        textResponse.setText(response);
        super.onPostExecute(result);
    }

}//MyClientTask

【问题讨论】:

  • 更正:它实际上在“inputStream.read(buffer)”处超时

标签: android sockets tcp timeout


【解决方案1】:

您正在阅读响应,直到流结束。在对等方关闭连接之前不会发生流结束。你有一个读取超时:ergo,可能,他没有关闭连接。否则你的超时时间太短了。两秒不算多。

您需要一种正确的方式来阅读响应,或者在收到的部分进行处理。

【讨论】:

  • 我明白了。读取“buffer.length”字节后,读取请求不会停止吗? (减少缓冲区大小没有帮助)
  • 当然可以,但是你将它放在一个循环中,它只在流的末尾终止。我没有说缓冲区大小或减少它。
  • 循环似乎不是问题,它超时:“inputStream.read(buffer)”。也就是说,用“bytesRead = inputStream.read(buffer,0,1);”替换整个循环仍然超时。
  • 用什么替换整个循环?如果您的意思是单次读取或循环中的第一次读取仍然超时,则服务器根本没有响应,或者您的超时时间太短。你确定你正在发送一个有效的命令吗?如果命令真的是一行,那么响应肯定也是一行吗?在这种情况下,您可以使用 BufferedReader.readLine() 代替所有代码。
  • 您是否尝试过更长的超时时间?请求真的是线条吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多