Подключение сокета со статическим IP в сети Wi-Fi, когда мобильные данные включены - PullRequest
0 голосов
/ 29 сентября 2019

Мне необходимо разработать приложение для Android, которое требует, чтобы телефон подключился к серверу, открыв сокет.Я могу добиться этого, когда я только что подключен к определенной сети Wi-Fi (то есть сети Wi-Fi, на которой размещен сервер), но в ситуации, когда я подключен к сети Wi-Fi и сети мобильной передачи данных, я получаю исключение сокета, какAndroid пытается подключить сокет через мобильную сеть

Я уже смог подключить устройство, когда оно только что подключено к Wi-Fi устройства, для которого требуется установить подключение к сокету

  static class StartTCPconnection extends AsyncTask<Void, Void, Void> {
    final WeakReference<RemoteActivity> activity;

    StartTCPconnection(WeakReference<RemoteActivity> activity) {
        this.activity = activity;
    }


    @Override
    protected Void doInBackground(Void... voids) {
        try {
            socket = new Socket("192.168.4.1", 900);
            Log.d(TAG, "is socket connected ? ...." + socket.isConnected());
            printWriter = new PrintWriter(socket.getOutputStream(), true);
            Log.i(TAG, "Checking if socket is really connected " + (socket.getLocalSocketAddress()));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        if (socket != null) {
            if (socket.isConnected() && isWifi) {
                Log.d(TAG, "onPostExecute: " + socket.isConnected());
                Toast.makeText(activity.get(), "Connection established", Toast.LENGTH_SHORT).show();
                Log.e(TAG, "onPostExecute: " + activity.get().getSharedPreferences(Constants.REMOTE_SWITCH_SHARED_PREFERENCE, Context.MODE_PRIVATE).getInt(Constants.REMOTE_SWITCH_KEY, 99));
                if (activity.get().getSharedPreferences(Constants.REMOTE_SWITCH_SHARED_PREFERENCE, Context.MODE_PRIVATE).getInt(Constants.REMOTE_SWITCH_KEY, 1) == 1) {
                    activity.get().joyStickFragment.checkSocketInstance(socket);
                    activity.get().joyStickFragment.changeUIForConnect();
                } else if (activity.get().getSharedPreferences(Constants.REMOTE_SWITCH_SHARED_PREFERENCE, Context.MODE_PRIVATE).getInt(Constants.REMOTE_SWITCH_KEY, 1) == 2) {
                    Log.e(TAG, "onPostExecute:Check  " + socket.isConnected());
                    activity.get().buttonRemoteFragment.checkSocketInstance(socket);
                    activity.get().buttonRemoteFragment.changeUIForConnect();
                }
                activity.get().connectionIndicatorImage.setImageResource(R.drawable.avishkaar_logo_on);
                activity.get().wifiIndicator.setImageResource(R.drawable.wifi_connected_icon);
            }

        } else {
            //   Toast.makeText(activity.get(), "Wrong Wifi Network connected", Toast.LENGTH_SHORT).show();
        }

    }
}

Вышеупомянутый код соединяет меня с розеткой, если единственной доступной сетью является WiFi устройства и мобильная сеть отключена

1 Ответ

0 голосов
/ 29 сентября 2019

Нет ничего особенного с точки зрения программирования между подключением к серверу, который находится в локальной сети, и сервером, которого нет.Единственным требованием является то, что сервер фактически доступен в первую очередь, то есть не в частной недоступной сети и не заблокирован брандмауэром или чем-то подобным.И, конечно же, общедоступный адрес сервера используется в качестве места назначения в программе.

        socket = new Socket("192.168.4.1", 900);

192.168.4.1 - это адрес в частной сети ,Это означает, что он недоступен из Интернета, что также означает, что он недоступен, если вы подключаетесь к мобильным данным или используете Wi-Fi в другой сети (например, в публичной точке доступа).

Чтобы сделатьвозможно подключение к внешней частной сети, сервер должен быть доступен вне этой сети, то есть должен иметь общедоступный маршрутизируемый IP-адрес.Если сервер находится в какой-то типичной домашней сети, это может быть достигнуто с помощью переадресации порта в маршрутизаторе.Для более крупных установок такие серверы расположены в центрах обработки данных, к которым можно напрямую подключиться из Интернета или (в особом случае) в облаке .

...