android p2p 连接服务器上,当通过Wi-Fi P2P使用网络服务发现时无法连接到Android设备每个人都可以使用网络服务发现...

! 我正在开发一个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的。

2016-11-04

Nilio

+1

你需要一个ServerSocket接受来自其他设备.... –

+0

Socket连接我感谢您的评论。我刚刚编辑了我的问题,并添加了有关ServerSocket的更多信息。 –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值