我正在创建一个应用程序来检查某些连接(查找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是热点的默认Android IP地址,而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();
它甚至没有连接到服务器套接字,只是等到超时。我有什么不对吗?
提前致谢。
答案 0 :(得分:0)
您无法在创建热点的设备上创建IP(192.168.43.1)的服务器套接字。因此,只需反转已连接到热点的另一台设备上的服务器套接字即可。
例如假设您已经在设备A上创建了热点,并且设备B已连接到设备A,因此使用指定的本地IP在设备B上创建服务器套接字,并通过查找设备B的IP在A中创建套接字实例。