【问题标题】:TCP Client Socket. Connect and wait for input streamTCP 客户端套接字。连接并等待输入流
【发布时间】:2014-02-03 13:45:42
【问题描述】:

我有一个 wifi sd 卡,它会在我用相机拍摄照片后向我发送 TCP 包,其中包含有关内存中新图像的信息。

在终端上,我可以使用这个 netcat 命令读取输入流。 netcat 连接 ip 192.168.11.254 并监听 5566 端口。第二行是我收到的图片路径。

$ nc 192.168.11.254 5566
>/mnt/sd/DCIM/109_0302/IMGP0101.JPG

在我的应用程序中,我有一个 Java 客户端套接字,它连接到相同的 ip 和端口。但是我没有像在 netcat 中那样收到输入流,没有任何反应。

void startListenForTCP (){
    Thread TCPListenerThread = new Thread(new Runnable() {
        @Override
        public void run() {

            Boolean run = true;
            String serverMessage = null;
            InetAddress serverAddr = null;

            try {
                serverAddr = InetAddress.getByName("192.168.11.254");
                Socket clientSocket = new Socket(serverAddr, 5566);

                try{
                    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

                    while (run) {
                        serverMessage = in.readLine();
                        mHandler.post(new DisplayToast(context, "TCP : " + serverMessage));
                    }

                } catch(UnknownHostException e) {
                    mHandler.post(new DisplayToast(context, "UnknownHostException"));

                } catch(IOException e) {
                    mHandler.post(new DisplayToast(context, "IOException"));
                } finally {
                    clientSocket.close();
                }

            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    });
    TCPListenerThread.start();
}

【问题讨论】:

    标签: java android sockets tcp


    【解决方案1】:

    试试这个可能有用

    步骤 1

    删除这两行:

    serverAddr = InetAddress.getByName("192.168.11.254");
    Socket clientSocket = new Socket(serverAddr, 5566);
    

    添加这一行:

    Socket clientSocket = new Socket("192.168.11.254", 5566);
    

    第二步

    删除此代码:

    try {
        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        while (run) {
            serverMessage = in.readLine();
            mHandler.post(new DisplayToast(context, "TCP : " + serverMessage));
        }
    }
    

    添加此代码:

    try {
        char[] buffer = new char[2048];
        int charsRead = 0;
        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        while ((charsRead = in.read(buffer)) != -1) {
            String message = new String(buffer).substring(0, charsRead);
            Log.e("In While", "msg :"+message);   
        }
    }
    

    【讨论】:

      【解决方案2】:

      BufferedReader.readLine() 的 javadoc 声明:

      读取一行文本。一条线被认为被任何人终止 换行符 ('\n')、回车符 ('\r') 或回车符 紧接着是换行符。

      如果卡不发送某种行尾,此方法将永远不会返回。尝试从clientSocket.getInputStream() 读取directyl。这不会做任何缓冲。

      【讨论】:

      • 很好的解释。这就是我没有得到按摩的原因。
      • Bash 在线是echo -e "/mnt/sd/DCIM/109_0302/IMGP0101.JPG\r" | nc 192.168.11.254 5566
      猜你喜欢
      • 2017-12-10
      • 2019-09-20
      • 2013-08-27
      • 2012-03-29
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      相关资源
      最近更新 更多