Java 在Android中使用套接字时如何处理数据漫游?

Java 在Android中使用套接字时如何处理数据漫游?,java,android,sockets,ip,Java,Android,Sockets,Ip,我正在用Android编写一个游戏,它使用人工智能,需要很大的CPU能力,这是普通Android设备所没有的。所以我决定用Java编写一个服务器,使用套接字计算所有内容并向客户端(android设备)返回一个值 现在,我习惯于为个人电脑编程,但不习惯为手机编程。在移动设备中,由于数据漫游和WIFI,设备的IP可以来回变化。 我的问题是,如何处理不断变化的IP?如何判断新连接是同一设备?或者Android设备会自动完成所有这些 我是stackoverflow的新手,希望我没有问太多问题。:) 非常

我正在用Android编写一个游戏,它使用人工智能,需要很大的CPU能力,这是普通Android设备所没有的。所以我决定用Java编写一个服务器,使用套接字计算所有内容并向客户端(android设备)返回一个值

现在,我习惯于为个人电脑编程,但不习惯为手机编程。在移动设备中,由于数据漫游和WIFI,设备的IP可以来回变化。 我的问题是,如何处理不断变化的IP?如何判断新连接是同一设备?或者Android设备会自动完成所有这些

我是stackoverflow的新手,希望我没有问太多问题。:)
非常感谢您的回答

您根本不需要处理ip更改。客户端(安卓设备)必须知道服务器主机/ip,并在与网络断开连接时重新连接,仅此而已

private static class ConnectionTask implements Runnable {

    private boolean connected;

    @Override public void run() {
        try {
            InetAddress serverAddress = InetAddress.getByName("host");
            Socket socket = new Socket(serverAddress, 9999);
            connected = true;

            while (connected) {
                // sending or writing data
            }

        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            //here you lost the connection due to some reason
            //you need to notify user about the problem and wait for connection
        }
    }
}
要接收有关网络状态的事件,您需要注册接收者:

context.registerReceiver(new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (isNetworkAvailable()) {
            unregisterReceiver(this);
            tryToConnect();
        }
    }
}, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));

好了,伙计们,我想出了一个办法,感谢《袜子里的狐狸》的回答。 每次用户连接到服务器套接字时,您都会获取他的UUID(或者它的散列版本,如果您需要更高的安全性:P)。 然后,当该用户由于某种原因断开连接并再次尝试连接到服务器套接字时,他将发送相同的UUID。这样,您就可以判断这两个连接是相同的,并继续处理

有关UUID的更多信息,请参见此处:

谢谢大家!:)
现在,我如何将此问题标记为封闭问题P

是的,但是如果我尝试重新连接,服务器将收到来自不同IP的新连接请求。我该怎么处理?我如何判断这个新IP是以前的同一个用户?@user1638851显然您需要验证用户身份。它可以是登录/通过或其他。但这是另一个问题。但我不需要任何身份验证。让我解释清楚。比如说,我想制作一款类似Siri的应用程序。你对Siri说了些什么,她将我的备忘录发送给Siri服务器,服务器会向客户返回答案。不需要身份验证。那么,如果我不验证我的用户,我如何判断不同的IP是同一个用户呢?@user1638851 iOS设备可以发送
UUID
。您无需将问题明确标记为已关闭。这是通过至少有一个答案隐式实现的。但是,您应该选择一个答案作为首选答案。这可以通过任何级别的声誉来实现。一旦你获得了足够的声誉,你可能想重新审视你的问题,并在适用的情况下对其他答案进行投票。