Android 客户端 Socket 直到 write() 才连接



我在Android应用程序中的套接字通信中遇到问题。在客户端调用 Socket.connect(adr,time) 后,服务器端(用 C 编写)没有任何反应(accept() 不返回新套接字)。只有当我在客户端向套接字写入内容时,通信才会开始,服务器才会发送欢迎消息。当我使用telnet时,一切正常。有人可以向我解释为什么 connect() 方法直到第一次 write() 才连接?

因此,这里有一些有问题的客户端代码的解释。在主活动中单击此按钮后,通信开始:

  private View.OnClickListener buttonConnectOnClickListener = new View.OnClickListener() {
    public void onClick(View v){
            commTask = new TCPComm();
            commTask.execute();
      }
};

它执行新的AsyncTask与服务器通信:

 public class TCPComm extends AsyncTask<Void, byte[], Boolean> {
    Socket commSock;
    InputStream netInStream;
    OutputStream netOutStream;
    BufferedReader inFromServer;

    @Override
    protected void onPreExecute() {
        outputText("Connecting to LightServer");
    }
    @Override
    protected Boolean doInBackground(Void... params) {
        boolean result = false;
        String srvResponse;
        try {
            SocketAddress sockaddr = new InetSocketAddress("XXX.XXX.XXX.XXX", XXXX);
            commSock = new Socket();
            commSock.setTcpNoDelay(true);
            commSock.connect(sockaddr, 5000);
                if (commSock.isConnected()) {
                netInStream = commSock.getInputStream();
                netOutStream = commSock.getOutputStream();
                inFromServer = new BufferedReader(new InputStreamReader(netInStream));
                while((srvResponse = inFromServer.readLine()) != null){
                    byte[] responseArray = srvResponse.getBytes();
                    publishProgress(responseArray);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
            result = true;
        } finally {
            closeSocket();
        }
        return result;
    }

    @Override
    protected void onProgressUpdate(byte[]... values) {
        if (values.length > 0) {
            if (Arrays.equals(values[0],msgPIN)) {
                pin = pinEdit.getText().toString().trim()+"#";
                SendResponse(pin);
            }
            if (Arrays.equals(values[0],msgCOM)) {
                authenticated = true;
                relaySwitch.setEnabled(true);
            }
        }
    }
}

但是此任务不会连接到服务器。只有当我向套接字写入内容时,才建立了连接,服务器发送了第一条消息。我只用AsyncTask的这个片段编写了简单的java应用程序:

SocketAddress sockaddr = new InetSocketAddress("XXX.XXX.XXX.XXX", XXXX);
commSock = new Socket();
commSock.setTcpNoDelay(true);
commSock.connect(sockaddr, 5000);

它连接没有问题,所以我认为这个问题与安卓和 AsyncTask 的处理有关

:D我找到了解决方案。在移动设备上一切正常。在模拟器上,此连接已断开。我认为这与 NAT 有关。在我的测试环境中,在模拟器上运行的客户端连接到 LAN 上的服务器。也许有人可以解释如何设置 adb 以在这种连接下正常工作?

相关内容

最新更新