Java ServerSocket.getLocalSocketAddress()返回空
我正在尝试创建一个本地服务器,在Android手机和Raspberry Pi之间使用Wi-Fi P2P,并使用Android作为主机。我已经能够在Pi上使用Java ServerSocket.getLocalSocketAddress()返回空,java,android,android-wifi,wifip2p,Java,Android,Android Wifi,Wifip2p,我正在尝试创建一个本地服务器,在Android手机和Raspberry Pi之间使用Wi-Fi P2P,并使用Android作为主机。我已经能够在Pi上使用wpa_cli成功地建立P2P连接,但现在我正在尝试使用C客户端套接字连接到手机并传输数据。但是,行Log.d(“套接字等待”,serverSocket.getLocalSocketAddress().toString())吐出D/套接字等待::/::8888。它似乎根本没有地址,所以我应该如何连接到它 正如我的评论所指出的,我的研究告诉我正
wpa_cli
成功地建立P2P连接,但现在我正在尝试使用C客户端套接字连接到手机并传输数据。但是,行Log.d(“套接字等待”,serverSocket.getLocalSocketAddress().toString())代码>吐出D/套接字等待::/::8888
。它似乎根本没有地址,所以我应该如何连接到它
正如我的评论所指出的,我的研究告诉我正确的IP应该是192.168.49.1。如果IP有任何不同,那也没关系,因为我可以向手机发送一个BLE数据包,告诉它IP。我的问题是IP是完全空白的
对于等待连接的线程,我的代码如下:
public static class DataTransfer extends Thread {
@Override
public void run() {
Log.d("DataTransfer", "Start");
ServerSocket serverSocket = null;
try {
/**
* Create a server socket and wait for client connections. This
* call blocks until a connection is accepted from a client
*/
// Expects a connection at 192.168.49.1:8888
serverSocket = new ServerSocket(8888);
//serverSocket.setReuseAddress(true);
//serverSocket.toString()
Log.d("Socket waiting", serverSocket.getLocalSocketAddress().toString());
Socket client = serverSocket.accept();
InputStream inputstream = client.getInputStream();
Log.d("InputStream Available", String.valueOf(inputstream.available()));
serverSocket.close();
}
catch (IOException e) {
Log.e("Receive Error", e.getMessage());
if(serverSocket != null) {
try {
serverSocket.close();
} catch (IOException ex) {
Log.e("Failed to close socket", ex.getMessage());
}
}
return;
}
}
}
这里是Pi上的ip a
的输出,一旦通过Wi-Fi P2P连接
11: p2p-wlan0-8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether b2:0e:07:e6:e6:55 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.23/24 brd 192.168.1.255 scope global noprefixroute p2p-wlan0-8
valid_lft forever preferred_lft forever
inet6 fe80::e79c:33f3:6e49:b6ed/64 scope link
valid_lft forever preferred_lft forever
11:p2p-wlan0-8:mtu 1500 qdisc pfifo\U快速状态更新组默认qlen 1000
链路/以太网b2:0e:07:e6:e6:55 brd ff:ff:ff:ff:ff:ff:ff:ff
inet 192.168.1.23/24 brd 192.168.1.255作用域全局noprefixroute p2p-wlan0-8
永远有效\u lft首选\u lft永远有效
inet6 fe80::e79c:33f3:6e49:b6ed/64范围链接
永远有效\u lft首选\u lft永远有效
最终编辑:
我的问题似乎无关。正如下面两条评论所指出的,显示的IP是好的,它只是意味着它接受来自任何东西的连接。我的实际问题是,我在Pi上设置了一个静态IP,但没有指定静态IP用于哪个接口。客户端需要位于192.168.49.#地址上,而静态IP阻止了它。:
。它表示您正在为来自所有接口的请求提供服务
这是预期的行为。这有什么问题吗 :
是最重要的。它表示您正在为来自所有接口的请求提供服务
这是预期的行为。这有什么问题吗 您可以通过向构造函数传递地址来指定服务器套接字正在侦听的接口:
serverSocket = new ServerSocket(8888, 10, InetAddress.getByName("192.168.49.1"));
查看::
表示服务器正在侦听所有接口上的IPv6连接。由表示的,可以写成:
。但您正在尝试连接到IPv4地址,而不是IPv6。我使用过的大多数系统都配置为IPv6服务器可以接受IPv4连接,但我想你的系统不是这样。对的回答建议您可以使用sysctl
更改系统的行为:
sysctl net.ipv6.bindv6only=0
通过向构造函数传递地址,可以指定服务器套接字正在侦听的接口:
serverSocket = new ServerSocket(8888, 10, InetAddress.getByName("192.168.49.1"));
查看::
表示服务器正在侦听所有接口上的IPv6连接。由表示的,可以写成:
。但您正在尝试连接到IPv4地址,而不是IPv6。我使用过的大多数系统都配置为IPv6服务器可以接受IPv4连接,但我想你的系统不是这样。对的回答建议您可以使用sysctl
更改系统的行为:
sysctl net.ipv6.bindv6only=0
我懂了。我的客户端正在尝试访问IPv4地址192.168.49.1,但连接尚未建立。那么,这是否意味着另一个问题?我明白了。我的客户端正在尝试访问IPv4地址192.168.49.1,但连接尚未建立。那么,这是否意味着另一个问题?192.168.49.1是我被认为是主机的IP地址。我想将客户机连接到主机,但我无法获取其IP,所以我只能这样做。所以你不知道主机的实际地址是什么?你能在主机上安装一个外壳吗<代码>ip a
将告诉您它拥有的地址。如果您只能运行Java代码,那么可以使用NetworkInterface.getNetworkInterfaces()枚举网络接口及其地址好的,我得到的地址是192.168.49.1,这是正确的。这一定意味着我的任务不可能完成,因为我知道客户端在连接到其他(非P2P)本地地址时工作,并且我知道P2P连接已经建立。标记为已解决。我解决了问题。我会在上面编辑我的帖子。非常感谢你的帮助!192.168.49.1是我被认为是主机的IP地址。我想将客户机连接到主机,但我无法获取其IP,所以我只能这样做。所以你不知道主机的实际地址是什么?你能在主机上安装一个外壳吗<代码>ip a将告诉您它拥有的地址。如果您只能运行Java代码,那么可以使用NetworkInterface.getNetworkInterfaces()枚举网络接口及其地址好的,我得到的地址是192.168.49.1,这是正确的。这一定意味着我的任务不可能完成,因为我知道客户端在连接到其他(非P2P)本地地址时工作,并且我知道P2P连接已经建立。标记为已解决。我解决了问题。我会在上面编辑我的帖子。非常感谢你的帮助!