简体   繁体   English

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

[英]Android client Socket not connectig until write()

I have a problem with socket communication in Android app. 我在Android应用程序中的套接字通信有问题。 After client call to Socket.connect(adr,time) nothing happens on server (written in C) side (accept() not returning new socket). 在客户端调用Socket.connect(adr,time)之后,服务器端(用C编写)没有任何反应(accept()不返回新的套接字)。 Only when I write something to socket on the client side, communication starts and server sends welcome message. 只有当我在客户端的套接字上写一些东西时,通信才开始,服务器会发送欢迎消息。 When I am using telnet everything works fine. 当我使用telnet时,一切正常。 Can somebody please explain to me why connect() method not connects until first write()? 有人可以向我解释为什么connect()方法直到第一次write()才连接吗?

So here is some explanation of problematic client code. 因此,这里是一些有问题的客户端代码的解释。 Communication starts after clicking this button in main activity: 在主要活动中单击此按钮后,通信开始:

  private View.OnClickListener buttonConnectOnClickListener = new View.OnClickListener() {
    public void onClick(View v){

            commTask = new TCPComm();
            commTask.execute();
      }
};

It executes new AsyncTask to communicate with server: 它执行新的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);

            }

        }
    }

}

But this task does not make connection to server. 但是此任务不会建立与服务器的连接。 Only when I write something to socket connection is established and server sends first message. 仅当我向套接字连接写入内容并且服务器发送第一条消息时。 I wrote simple java app only with this fragment of AsyncTask: 我只用以下AsyncTask片段编写了简单的Java应用程序:

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

and it connects with no problems so i think that this issue is related to android and processing of AsyncTask 并且它连接没有问题,所以我认为这个问题与android和AsyncTask的处理有关

:DI have found a solution. :DI找到了解决方案。 Everything works fine on mobile. 在移动设备上一切正常。 On emulator this connections are broken. 在仿真器上,此连接断开。 I think that this is related to NAT. 我认为这与NAT有关。 In my test environment client running on emulator connects to server on LAN. 在我的测试环境中,在模拟器上运行的客户端连接到LAN上的服务器。 Maybe someone can explain how to setup adb to work properly with this kind of connections? 也许有人可以解释如何设置adb以使这种连接正常工作?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM