Android подключается к модему
У меня есть 2 устройства Android, один работает как сервер, который находится в режиме привязки и принимает соединения с портом.
Другое устройство действует как клиент, который подключается к серверной точке доступа и устанавливает соединение с сервером через порт. (Все делается без маршрутизатора посередине).
Код сервера выглядит так: (Когда сервер android выполняет код, устройство находится в режиме привязки)
ServerSocket server = new ServerSocket(PORT);
while (true) {
Socket client;
client = server.accept();
ClientThread com = new ClientThread(client, this);
Thread t = new Thread(com);
t.start();
}
Клиентский код выглядит следующим образом: (когда клиент android выполняет этот код, устройство подключается к точке доступа)
Socket client = new Socket();
int serverIP = wifiManager.getDhcpInfo().serverAddress;
String stringIP = android.text.format.Formatter.formatIpAddress(serverIP);
InetAddress address = InetAddress.getByName(stringIP);
SocketAddress socketAddress = new InetSocketAddress(address, PORT);
client.connect(socketAddress);
Я получаю следующую ошибку на клиенте
java.net.ConnectException: failed to connect to /192.168.43.1 (port 12345): connect failed: ENETUNREACH (Network is unreachable)
at libcore.io.IoBridge.connect(IoBridge.java:114)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
at java.net.Socket.connect(Socket.java:842)
at java.net.Socket.connect(Socket.java:785)
at com.alternatewifimeshmessaging.HostManager.clientConnect(HostManager.java:283)
at com.alternatewifimeshmessaging.HostManager.client(HostManager.java:189)
at com.alternatewifimeshmessaging.HostManager.run(HostManager.java:59)
at java.lang.Thread.run(Thread.java:856)
Caused by: libcore.io.ErrnoException: connect failed: ENETUNREACH (Network is unreachable)
at libcore.io.Posix.connect(Native Method)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
at libcore.io.IoBridge.connect(IoBridge.java:112)
... 8 more
Сервер не дает ошибок.
У меня есть следующий набор разрешений в файле манифеста Android:
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
В идеале мне нужно будет перенести некоторые данные с сервера на клиент.
Что я делаю неправильно?
Ответы
Ответ 1
При тестировании выясняется, что соединение не может быть установлено на устройстве привязки.
Но если мы отменим процесс и откройте серверный сервер на подключенном клиенте. И подключитесь к нему с модемного устройства, он будет работать.
Таким образом, обратное сообщение является ответом.
Ответ 2
Сторона сервера
class ServerThread implements Runnable {
public void run() {
socket = new Socket();
try {
serverSocket = new ServerSocket(SERVERPORT);
} catch (IOException e) {
e.printStackTrace();
}
while (!Thread.currentThread().isInterrupted()) {
try {
socket = serverSocket.accept();
CommunicationThread commThread = new CommunicationThread(socket);
new Thread(commThread).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Клиентская сторона
class ClientThread implements Runnable {
@Override
public void run() {
try {
socket = new Socket();
InetSocketAddress socketAddress = new InetSocketAddress(SERVER_IP, SERVERPORT);
socket.connect(socketAddress);
CommunicationThread commThread = new CommunicationThread(socket);
new Thread(commThread).start();
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
Ответ 3
В привязке к Wi-Fi соединение провайдер не может работать как клиент. Поэтому нам нужно реализовать двунаправленное соединение сокетов tcp. Используйте серверный сокет с номером порта в устройстве, которое находится в режиме привязки. Это устройство действует как сервер. В клиентском устройстве используйте сокет для доступа к клиентскому порту с IP-адресом.