0

我在 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);

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

4

1 回答 1

0

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

于 2013-09-22T10:44:52.733 回答