我的 android 应用程序使用 TCP 套接字连接服务器,以确保连接正常,服务器在空闲时每 10 秒发送一次“keep-alive”消息,我可以在 WireShark 中抓取数据包,但在我的应用程序中,我无法在任何地方处理数据包,似乎无法用套接字读取数据包。
下面是我的套接字连接的代码段。似乎“keep-alive”数据包无法用输入流读取...
public class SocketBase {
private Socket mSocket;
private DataOutputStream out;
private DataInputStream in;
private SocketCallback callback;
private int timeOut = 1000 * 30;
public SocketBase(SocketCallback callback) {
this.callback = callback;
}
public void connect(String ip, int port) throws Exception {
mSocket = new Socket();
SocketAddress address = new InetSocketAddress(ip, port);
mSocket.connect(address, timeOut);
if (mSocket.isConnected()) {
out = new DataOutputStream(mSocket.getOutputStream());
in = new DataInputStream(mSocket.getInputStream());
callback.connected();
}
}
public void write(byte[] buffer) throws IOException {
if (out != null) {
out.write(buffer);
out.flush();
}
}
public void disconnect() {
try {
if (mSocket != null) {
if (!mSocket.isInputShutdown()) {
mSocket.shutdownInput();
}
if (!mSocket.isOutputShutdown()) {
mSocket.shutdownOutput();
}
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
mSocket.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
callback.disconnect();
out = null;
in = null;
mSocket = null;
}
}
public void read() throws IOException {
if (in != null) {
byte[] buffer = new byte[1024*1];
byte[] tmpBuffer;
int len = 0;
Log.i("SOCKET", "something comming");
while ((len = in.read(buffer)) > 0) {
tmpBuffer = new byte[len];
System.arraycopy(buffer, 0, tmpBuffer, 0, len);
callback.receive(tmpBuffer);
tmpBuffer = null;
}
}
}
}
WireShark中的“keep-alive”数据包是这样的:
最佳答案
如果您指的是常规 TCP 保持 Activity 状态,则您无需检测或执行任何操作。您的 TCP 实现负责确认它。里面没有应用程序数据,所以你没有什么可读的。
关于android - 如何对android中的 "keep-alive"包使用react?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26726587/