Android客户端Socket没有连接,直到write()

时间:2013-09-16 00:56:23

标签: java android c sockets

我在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的处理有关

1 个答案:

答案 0 :(得分:0)

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