我有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>
理想情况下,我需要将一些数据从服务器传输到客户端。
我做错了什么?
答案 0 :(得分:14)
通过测试证明无法在网络共享设备上建立连接。
但是如果我们撤销进程并在连接的客户端上打开serversocket。并从绑定设备连接到它,它将工作。
所以扭转沟通就是答案。
答案 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();
}
}
}
答案 2 :(得分:1)
在系留wifi连接中,连接提供程序无法作为客户端工作。所以我们需要实现双向tcp套接字连接。在处于网络共享模式的设备中使用带有端口号的服务器套接字。该设备充当服务器。在客户端设备中,使用套接字访问具有IP地址的客户端端口。