Java 关闭旧套接字后创建新套接字会导致连接被拒绝

Java 关闭旧套接字后创建新套接字会导致连接被拒绝,java,android,sockets,Java,Android,Sockets,我是android编程新手,我正在尝试将一个程序从标准java移植到android。这个java应用程序包含套接字。当我移植程序时,如果我按下按钮太快,我的连接就会被拒绝。我做了一个简单的测试程序 Thread thread = new Thread(new Runnable() { @Override public void run() { try { Socket mySocket = new Socket();

我是android编程新手,我正在尝试将一个程序从标准java移植到android。这个java应用程序包含套接字。当我移植程序时,如果我按下按钮太快,我的连接就会被拒绝。我做了一个简单的测试程序

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Socket mySocket = new Socket();
            InetSocketAddress address = new InetSocketAddress("10.94.35.24", 5000);
            mySocket.connect(address, 5000);
            mySocket.shutdownOutput();
            mySocket.shutdownInput();
            mySocket.close();
            Log.w("Socket", "Socket closed");
            Socket mySocket2 = new Socket();
            mySocket2.connect(address, 5000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});
thread.start();
我有一个服务器在这个IP和端口上运行,我的程序在我计算机上的java应用程序上运行良好。但是在android上,程序在尝试连接到mySocket2时会出现以下异常

java.net.ConnectException:无法连接到/10.94.35.24(端口 5000毫秒后:断开连接失败:ECONREFUSE(连接 (拒绝)

我的猜测是,这与android操作系统的局限性有关,但我希望不是这样。是否有人知道我做错了什么,或者可以确认Android中的套接字有这些限制?

扩展SocketException

表示:表示尝试将套接字连接到远程地址和端口时出错。通常,连接被远程拒绝(例如,没有进程在远程地址/端口上侦听)

“连接被拒绝”
错误表示服务器计算机上的套接字堆栈收到您的连接请求,并故意拒绝接受。发生这种情况的原因有两种:

1) 您尝试连接的端口上没有正在运行的侦听套接字

2) 有一个侦听套接字,但它的待定连接积压已满,因此此时没有空间对您的请求进行排队


要区分两者,请尝试重新连接几次,每次尝试之间都有延迟。如果你总是犯同样的错误,那么#1很可能是罪魁祸首。确保端口号正确。如果#2是罪魁祸首,您的重新连接最终有成功的机会。

您不需要在关闭套接字之前调用这些关闭方法。关闭就足够了。也尝试过了,在我的电脑上仍然有效,但在我的手机上不起作用。这不是一个回答。这就是为什么我把它作为评论发布。是的,我知道。但我的问题是:在android和其他环境中,这种行为会有所不同吗。例如,安卓系统关闭套接字的速度要比windows或ubuntu慢。据我所知,这不是安卓系统的限制,而且我猜是服务器拒绝了你的连接。尝试在任何java ide上运行您的代码段。我已经在几台计算机、固定设备和笔记本电脑上尝试过我的代码段。在wifi和有线网络上。它适用于所有电脑,但不适用于任何安卓手机(我试过3种不同的型号),我也试过在两种型号之间延迟运行代码。它会延迟工作,这就是为什么我想知道android是否不会在我调用close时立即向服务器发送套接字关闭消息,也许它会因为某种原因等待发送消息?我需要大约2秒钟的延迟才能连接到新的插座。计算机上不会出现此问题!这就是为什么我觉得很奇怪,我想可能你是对的,如果它的工作延迟,那么可能是android操作系统需要一些时间来发送关机消息