安卓套接字连接被拒绝错误

3
我希望实现两个设备之间的套接字连接,客户端不断向服务器发送GPS数据,我需要在新线程中运行它们。客户端首先发送一个数据,然后一直显示以下错误:
03-18 16:35:11.805: E/Client run:(8163): java.net.ConnectException: failed to connect to /192.168.2.103 (port 5678): connect failed: ECONNREFUSED (Connection refused)
这是客户端代码:
    public class Send implements Runnable{

    private boolean Connect = true;

    public void Connect(){
        Connect = true;
    }
    public void Disconnect(){
        Connect = false;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(Connect){
            try {
                SocketClient = new Socket("192.168.2.103", 5678);
                ObjectOutputStream oos = new ObjectOutputStream(SocketClient.getOutputStream());
                oos.writeDouble(GPSinfo[2]);
                //ObjectInputStream ois = new ObjectInputStream(SocketClient.getInputStream());
                //ois.readInt();
                oos.close();
                //ois.close();
            } catch (Exception e) {
                Log.e("Client run: ", e.toString());
            }
        }

    }

}

这是服务器端代码。
    public class Receive implements Runnable{
    private boolean CanReceive = true;
    private double Data;

    public void Connect(){
        CanReceive = true;
    }
    public void Disconnect(){
        CanReceive = false;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub

        while(CanReceive){
            try {
                SocketServer = new ServerSocket(5678);
                Socket connectedSocket = SocketServer.accept();
                ObjectInputStream ois = new ObjectInputStream(connectedSocket.getInputStream());
                Data = ois.readDouble();
                DataText.setText("" + Data);
                //ObjectOutputStream oos = new ObjectOutputStream(connectedSocket.getOutputStream());
                //oos.writeInt(1);
                //ois.close();
                //oos.close();
            } catch (Exception e) {
                Log.e("Server run: ", e.toString());
            }

        }
    }

}

顺便提一下,这两段代码都是内部类,并且添加了INTERNET权限。

你的代码无法编译。SocketServer = new ServerSocket(5678); 这一行有错误,或者你在发布的代码中遗漏了对 SocketServer 的声明。 - undefined
4个回答

3
很明显这不是路由器防火墙相关的问题,因为您处于同一网络下,所以只有几种可能性:
  • 服务器端该IP上没有监听该端口
  • 服务器端有一个本地防火墙阻止了连接尝试
  • 您没有使用WIFI,因此不在同一网络下。

您应该确保可以通过其他方式打开该服务,这将帮助您调试问题的根源。如果您已经这样做了,我建议使用一些调试工具来跟踪TCP数据包(我也不知道目标机器上使用的操作系统类型;如果是某个Linux发行版,tcpdump可能会有所帮助,在Windows环境中,WireShark效果也很好)。


我确定在AndroidManifest.xml中添加了INTERNET权限,我的服务器可以接收到第一个数据。 - Tony
然后验证可能存在的其他问题,它必须是其中之一。 - nKn
我尝试使用您提到的WireShark捕获,是的,客户端可以继续向我发送数据,这意味着连接正常吗? - Tony
这意味着从客户端发送的数据(至少)已经到达了您的服务器端(假设您在服务器端使用 wireshark)。话虽如此,服务器端肯定出现了一些问题,可能是该端口上没有监听任何内容或者本地防火墙阻止了连接。 - nKn
@Tony 要么连接被拒绝,要么数据无法到达对等方。你不能两者兼得。 - user207421

3

这不是一个“数据传输错误”,而是一个“连接被拒绝”的错误。这意味着你想要传输数据的服务器并没有在你指定的IP地址和端口上运行。


0

在开始连接之前尝试终止adb服务。我曾遇到过类似的问题,终止adb服务后重新连接解决了这个问题。


2
你能解释一下吗?我该怎么做? - ralphgabb

-2
我曾经遇到过同样的错误。我只是使用了ServerSocket,然后它就正常工作了。 ServerSocket socket = new ServerSocket(8888);

楼主已经在使用ServerSocket了。你的回答没有解释任何内容,也没有回答任何问题。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接