我使用 Java 来实现一些套接字程序。
我发现Android和Java都有java.net.Socket
,但源代码不一样,所以它们有不同的行为。
我有一台服务器(可能是PC或Android),服务器有多个网络接口(例如以太网,无线,USB或蓝牙)。客户端将尝试同时连接所有服务器网络接口(一个连接一个线程)。在客户端找到可用连接之前,它们将通过连接进行通信。这样,我预计连接速度不会太低。
但是当客户端尝试连接到服务器时,它可能会遇到Android设备(Android SDK)中的重复连接情况。如果程序遇到重复连接情况,则前一个连接将被后一个连接重置或替换(我不确定)。同时,当读取或写入先前的连接时,它将抛出java.net.SocketException:recvfrom failed:ECONNRESET(由peer重置连接)。另一方面,当读取或写入后一种连接时,这是正常的,但连接速度不是很快。
这个问题在PC上似乎没有发生,但在客户端尝试连接服务器时发生在Android上。
我该如何解决?
修改
客户端代码如下:
private Socket socket;
private IP ip;
private IP[] IPs;
private boolean closing;
private int socketTriedCount;
...
socketTriedCount = 0;
for (final IP ipObj : IPs) {
if (closing) {
break;
}
new Thread() {
@Override
public void run() {
try {
if (socket == null) {
final Socket s = new Socket();
s.connect(new InetSocketAddress(InetAddress.getByName(ipObj.getIP()), ipObj.getPort()), timeout);
synchronized (Client.this) {
if (socket != null) {
//Should not be happened
//s.close();
socketTriedCount++;
} else {
ip = ipObj;
socket = s;
socketTriedCount++;
}
}
}
} catch (final Exception ioE) {
socketTriedCount++;
}
}
}.start();
}