【问题标题】:Creating new socket after closing an old one causes connection refused关闭旧套接字后创建新套接字会导致连接被拒绝
【发布时间】:2014-09-24 07:36:46
【问题描述】:

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

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

【问题讨论】:

  • 您不需要在关闭套接字之前调用那些关闭方法。关闭就足够了。
  • 也试过了,在我的电脑上仍然可以,但在我的手机上不行。
  • 这不是一个答案。这就是我将其作为评论发布的原因。

标签: java android sockets


【解决方案1】:

public class ConnectException 扩展 SocketException

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

"Connection Refused" 错误表示服务器机器上的套接字堆栈收到了您的连接请求并故意拒绝接受它。发生这种情况有两个可能的原因之一:

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

2) 有一个监听套接字,但它的待处理连接积压已满,因此此时没有空间来排队您的请求。

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

【讨论】:

  • 是的,我知道。但我的问题是:这在 android 和其他环境中的行为是否会有所不同。例如,android 以比 windows 或 ubuntu 更慢的方式关闭套接字。
  • 据我所知,这不是 android 限制,而且我猜它是拒绝您连接的服务器。尝试在任何 java ide 上运行您的代码 sn-p。
  • 我已经在几台电脑、固定设备和笔记本电脑上尝试了我的代码 sn-p。在wifi和有线网络上。它适用于所有计算机,但不适用于任何安卓手机(我尝试了 3 种不同的型号)。
  • 我也尝试过运行代码,但两者之间也存在延迟。它会延迟工作,这就是为什么我想知道一旦我调用close,android是否不会以某种方式向服务器发送套接字关闭消息,也许它出于某种原因等待发送消息?我需要大约 2 秒的延迟才能连接到新的套接字。电脑不会出现这个问题!这就是为什么我觉得它很奇怪
  • 我猜你是对的,如果它的工作延迟那么可能是 android os 需要一些时间来发送关机消息
猜你喜欢
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 2016-02-25
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多