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

时间:2014-09-24 07:36:46

标签: java android sockets

我是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)5000ms后:isConnected失败:ECONNREFUSED(连接   拒绝)

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

1 个答案:

答案 0 :(得分:0)

public class ConnectException 扩展SocketException

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

"Connection Refused"错误表示服务器计算机上的套接字堆栈收到了您的连接请求,并故意拒绝接受它。出现这种情况的原因有两个:

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

2)有一个侦听套接字,但其待处理连接的积压已满,因此此时无法为您的请求排队。

要区分这两者,请尝试重新连接几次,并在每次尝试之间延迟。如果你始终得到相同的错误,那么#1可能是罪魁祸首。确保端口号正确无误。如果#2是罪魁祸首,你的重新连接最终有可能成功。