我在使用wifi Direct时遇到问题。我设法连接了2台设备,并将数据从客户端发送到群组所有者,因为群组所有者ip是每个人都知道的。我还设法找出了客户端的IP并将其传递给组所有者,但是即使组应该是模拟的,我也无法将数据从组所有者发送给客户端。我正在使用IntentstartService()发送数据,并使用AsynkTask进行接收。仅使用2台设备,我注意到客户端IP始终是相同的(192.168.49.10),因此我将其手动提供给目的。

这是我尝试为所有者创建发送方和为客户端创建接收方的方法:

 @Override
    public void onConnectionInfoAvailable(final WifiP2pInfo info) {

        // InetAddress from WifiP2pInfo struct.
        InetAddress groupOwnerAddress = info.groupOwnerAddress;
        connected = true;
        ownerIP = groupOwnerAddress.getHostAddress();
        // After the group negotiation, we can determine the group owner.
        if (info.groupFormed && info.isGroupOwner) {
            Toast.makeText(MainActivity.this, "I'm the owner!!", Toast.LENGTH_SHORT).show();
            owner = true;
            // Do whatever tasks are specific to the group owner.
            // One common case is creating a server thread and accepting
            // incoming connections.
            Intent serviceIntent = new Intent(MainActivity.this, OwnerSender.class);
            serviceIntent.setAction(OwnerSender.ACTION_SEND);
            serviceIntent.putExtra(OwnerSender.EXTRAS_CLIENT_ADDRESS,"192.168.49.10");
            serviceIntent.putExtra(OwnerSender.EXTRAS_CLIENT_PORT, 8988);
            startService(serviceIntent);
            //new OwnerReceiver(this).execute(); // owner riceve dai client sulla porta 8988
        } else if (info.groupFormed) {
            // The other device acts as the client. In this case,
            // you'll want to create a client thread that connects to the group
            // owner.
            /*Intent serviceIntent = new Intent(MainActivity.this, ClientSender.class);
            serviceIntent.setAction(ClientSender.ACTION_SEND);
            serviceIntent.putExtra(ClientSender.EXTRAS_GROUP_OWNER_ADDRESS,ownerIP);
            serviceIntent.putExtra(ClientSender.EXTRAS_GROUP_OWNER_PORT, 8988);
            startService(serviceIntent);*/
            new ClientReceiver(this).execute(); // i client ricevono dall'owner sula porta 8989
            Toast.makeText(MainActivity.this, "I'm a client...", Toast.LENGTH_SHORT).show();
            Toast.makeText(MainActivity.this, "Server IP: " + groupOwnerAddress.getHostAddress(), Toast.LENGTH_SHORT).show();
        }
    }


建立连接后,此方法将启动,并且所有者应启动服务以发送数据,但该服务永远不会启动。我已经说过,如果在客户端使用相同的服务,并且数据已从客户端正确传输到所有者,则它将启动。

最佳答案

就像Laszlo Magyar所说的那样,您需要先向服务器发送一个空消息,以便服务器可以使用客户端套接字获取传入的IP地址。

我的解决方案是从客户端向服务器发送字符串,以便服务器可以知道客户端的IP地址,其余过程相同。

10-08 15:27
查看更多