Соединение сокета Android между точкой доступа и клиентом

Я делаю приложение, которое проверяет определенные соединения (ищет список SSID) и создает точку доступа для указанного соединения, если оно не находит его. В основном он должен действовать как локальная сеть. Мне удалось создать точку доступа, и после этого она прослушивает сокет сервера для входящих соединений:

Thread socketThread = new Thread(new Runnable() {
        @Override
        public void run() {
            int port = Constants.PORT + socketList.size()-1;
            try {
                ServerSocket serverSocket = null;
                serverSocket = new ServerSocket(port);
                Log.d(TAG, "Socket listening for connections: " + port);
                Socket client = serverSocket.accept();
                Log.d(TAG, "Server: connection done");
                InputStream inputstream = client.getInputStream();
                DataInputStream commStream = new DataInputStream(inputstream);
                byte[] b = new byte[16];
                while (commStream.read(b,0, 16) != -1)
                    Log.d(TAG, new String(b, "ASCII"));
                serverSocket.close();
                Log.d(TAG, "Server socket done");
            } catch (Exception e) {
                Log.e(TAG, e.toString());
            }
        }

    });
    socketList.add(socketThread);
    socketThread.start();

Если я создам точку доступа и подключусь к ней с помощью своего компьютера, я смогу использовать netcat и подключиться к указанному сокету:

netcat 192.168.43.1 8988

Где 192.168.43.1 — IP-адрес Android по умолчанию для точки доступа, а 8988 — порт, который я использую. Однако, когда я пытаюсь сделать то же самое через другое устройство, на котором запущено приложение и которое подключается к точке доступа, это не работает. Вот код клиента:

clientThread = new Thread(new Runnable() {
        @Override
        public void run() {
            int port = Constants.PORT ;
            try {
                Socket socket =new Socket();
                socket.bind(null);
                socket.connect((new InetSocketAddress("192.168.43.1", port)), 20000);
                OutputStream stream = socket.getOutputStream();
                DataOutputStream commStream = new DataOutputStream(stream);
                commStream.write("1234567890123456".getBytes());
                socket.close();
                Log.d(TAG, "Client socket done");
            } catch (Exception e) {
                Log.e(TAG, e.toString());
            }
        }

    });
    clientThread.start();

Он даже не подключается к сокету сервера, а просто ждет тайм-аута. Есть ли что-то, что я делаю неправильно здесь?

Заранее спасибо.


person Maldus    schedule 17.06.2016    source источник
comment
192.168.43.1 — это локальный IP-адрес, вы пытаетесь использовать его в своей локальной сети?   -  person earthw0rmjim    schedule 17.06.2016
comment
Это должен быть IP-адрес провайдера точки доступа (моего устройства); Я хочу, чтобы он создавал локальную сеть и связывался с подключенными к ней устройствами.   -  person Maldus    schedule 17.06.2016
comment
Не совсем, я просто приспособился к тому, чтобы открывать сокет сервера на клиентах и ​​заставлять точку доступа запускать соединение. До сих пор не понял, что было не так. Он уже выполнил свою задачу, но, возможно, я посмотрю его снова в будущем.   -  person Maldus    schedule 28.06.2016


Ответы (1)


Вы не можете создать сокет сервера с IP (192.168.43.1) на устройстве, которое создало точку доступа. Так что просто переверните сокет сервера на другом устройстве, которое было подключено к точке доступа.

например Допустим, вы создали точку доступа на устройстве A, а устройство B было подключено к A, поэтому создайте сокет сервера на устройстве B с назначенным локальным IP-адресом и создайте экземпляр Socket в A, найдя IP-адрес устройства B.

person Yogeshwar Sharma    schedule 03.03.2020
comment
Есть ли конкретная причина, по которой я не могу создать серверный сокет у провайдера точки доступа? - person Maldus; 19.03.2020