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