! 我正在开发一个Android应用程序,允许与附近已安装此应用程序的设备聊天。为了做到这一点,我使用Wi-Fi P2P API和网络服务发现来搜索附近的设备。 我已经编写了用于在服务启动的线程中搜索附近设备的代码。当检测到设备时,服务将它(通过广播意图)发送到显示到目前为止检测到的设备的活动。 检测到的设备被添加到recyclerView中,并且当用户按下其中一个时,必须建立到该设备的连接。 成功建立Wi-Fi Direct连接(即,WifiP2pManager.connect()方法成功),并捕获WIFI_P2P_CONNECTION_CHANGED_ACTION。 在广播接收机中,当这样的广播意图落入,下面的代码被执行:当通过Wi-Fi P2P使用网络服务发现时无法连接到Android设备每个人都可以使用网络服务发现
NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
if (networkInfo.isConnected()) {
mManager.requestConnectionInfo(mChannel, connectionInfoListener); }
随着requestConnectionInfo()方法我可以获取有关的连接,如装置I的IP地址的信息试图连接到。 为了获取这些信息,我提供了一个WifiP2pManager.ConnectionInfoListener实现,该实现由connectionInfoListener变量表示。 这是我实现WifiP2pManager.ConnectionInfoListener的代码:
“设备”是我实现广播接收器的现在正好是不重要的实例变量。相反,重要的是ConnectThread线程。这是处理在两个设备之间连接套接字所需的代码的线程。当我尝试连接到一个检测装置,ConnectThread在其run()方法,创建ChatConnection路过的IP地址和先前获得这一构造的端口号的新实例:
public ChatConnection(InetAddress srvAddress, int srvPort, String macAddress) throws IOException {
...
connSocket = new Socket(srvAddress, srvPort);
...
}
这里是哪里发生问题。当我测试物理设备上我的应用程序,我得到的是这样的例外:
W/System.err: java.net.ConnectException: failed to connect to /192.168.49.1 (port 6770): connect failed: ECONNREFUSED (Connection refused)
当然,我安装我的第二个物理设备上也应用程序,它被成功地检测和一个Wi-Fi直连连接获得成功建立。但是,当涉及到这行代码:
connSocket = new Socket(srvAddress, srvPort);
即抛出异常...... 我对这个问题的长度道歉,但我想是最清楚的。 我真的很感谢你提供任何帮助。
编辑:我忘了提及初始化ServerSocket的代码。
ServerSocket在Wi-Fi启用后立即启动的线程中进行初始化。
即,当WifiP2pBroadcastReceiver(内部类延伸的BroadcastReceiver应用的服务的)捕获一个WIFI_P2P_STATE_CHANGED_ACTION意图,它会检查是否在Wi-Fi使能,并且如果启用,则启动其中的ServerSocket位于螺纹:
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION)) {
int statoWiFi = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
if (statoWiFi == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
mNsdService = new NsdProviderThread();
mNsdService.start();
}
将ServerSocket被初始化在NsdProviderThread的run()方法:
public void run() {
...
try {
server = new ServerSocket(0);
} catch (IOException ex) {
return;
}
...
while (!Thread.currentThread().isInterrupted()) {
Socket clientSocket = null;
try {
clientSocket = server.accept();
} catch (IOException ex) {
break;
}
try {
ChatConnection chatConn = new ChatConnection(clientSocket);
synchronized (connections) {
connections.add(chatConn);
}
} catch (IOException ex) {
continue;
}
}
“服务器” 是NsdProviderThread的一个实例变量声明为ServerSocket的。
你需要一个ServerSocket接受来自其他设备.... –
Socket连接我感谢您的评论。我刚刚编辑了我的问题,并添加了有关ServerSocket的更多信息。 – Nilio