【问题标题】:tcp connection between Android server and PC clientAndroid服务器和PC客户端之间的tcp连接
【发布时间】:2015-01-19 23:10:45
【问题描述】:

服务器部分(Android)

new Thread(new Runnable() {
            public void run() {
                DatagramSocket s;

                try {
                    s = new DatagramSocket();
                    s.send(new DatagramPacket("aaa".getBytes(), 3, InetAddress.getByName(/* Server ip address*/), 11720));
                    s.close();
                } catch (UnknownHostException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }



                while(true)
                {
                try {
                    ServerSocket ssocket = new ServerSocket(11720);
                    ssocket.accept(); // Cannot make connection!!

                    Toast.makeText(a, "Who's coming", Toast.LENGTH_SHORT).show();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                }
            }
        }).start();

客户端代码(Java、PC)

public static void main(String[] args) {
    try {
        DatagramSocket ds = new DatagramSocket(11720);
        DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);
        ds.close();

        try {
            ds.receive(dp);

            // ds.send(new DatagramPacket("aaaa".getBytes(), 4, dp.getAddress(), 11720));
            Socket socket = new Socket(dp.getAddress(), 11720); // Cannot make connection!!
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

我想在 android 服务器和 pc 客户端之间建立连接。 首先android向pc发送一个数据包。 我认为服务器可以知道使用这个数据包,所以我使用函数 getAddress()。

然后android打开socket使用端口号11720和pc尝试连接android。 但它无法连接。

为什么这段代码无法建立连接?


哦,我只想知道如何从电脑连接到手机。 所以我改变了pc和android代码。

首先,我的目标是使用静态端口 (11720) 连接到 android。 但是使用 LTE 时无法使用静态端口进行连接。

所以我使用简单的程序检查套接字信息。

这是在电脑里。

public static void main(String[] args) {
    try {
        DatagramSocket ds = new DatagramSocket(11720);
        DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);

        while (true)
        {
            ds.receive(dp);
            System.out.println(dp.getSocketAddress());
        }

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }



}

这是在 android 中。

new Thread(new Runnable() {
            public void run() {
                try {
                    DatagramSocket s = new DatagramSocket(11720);
                    while(true)
                    {
                        s.send(new DatagramPacket("aaa".getBytes(), 3, InetAddress.getByName("143.248.55.131" /* Server address */), 11720));
                    }

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }).start();

我使用 WiFi 和 LTE 执行程序。 结果是

/143.248.56.118:11720 /143.248.56.118:11720
/143.248.56.118:11720
/117.111.7.124:35645 /117.111.7.124:35645
/117.111.7.124:35645

使用 LTE 时,socket 的端口号会改变。 所以我不能使用静态端口号发送数据包。

我该如何解决这个问题?

【问题讨论】:

    标签: java android sockets tcp connection


    【解决方案1】:

    首先,为什么不必要地使用 Datagram Socket 会变得复杂? 你可以简单地使用 TCP 没有任何问题。

    那么,您的客户端代码(Java PC)可能正在等待:

    ds.receive(dp);

    因此可能无法创建套接字。

    虽然android程序正在发送数据包但UDP不可靠,但客户端代码可能无法接收数据包。 此外,这可能是由于网络问题,例如两者都无法建立连接,或者它们之间可能存在 NAT,不允许任何 UDP 数据包进入。

    所以,我建议简单地使用 TCP。不要因为先发送 UDP 数据包,然后再使用 TCP 连接而变得复杂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      相关资源
      最近更新 更多