我在使用wifi Direct时遇到问题。我设法连接了2台设备,并将数据从客户端发送到群组所有者,因为群组所有者ip是每个人都知道的。我还设法找出了客户端的IP并将其传递给组所有者,但是即使组应该是模拟的,我也无法将数据从组所有者发送给客户端。我正在使用Intent
和startService()
发送数据,并使用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地址,其余过程相同。