Android和Java Socket没有相同的行为

时间:2014-11-26 09:51:32

标签: java android sockets

我使用 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();
}

0 个答案:

没有答案