我在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 以在这种连接下正常工作?