android - 使用 Wi-Fi direct 的点对点数据共享

标签 android sockets android-wifi wifi-direct

我正在开发一款使用 Wi-Fi direct 的 Android 多人游戏。 使用 Wi-Fi direct,我能够在对等设备之间建立连接。该代码还能够将数据从客户端设备发送到服务器设备。 (根据Android文档,Wi-Fi直连采用客户端-服务器模型)

问题:

我无法使用 Wi-Fi direct 将数据从服务器设备共享到客户端设备。

我有以下问题:

  1. 是否有任何其他方式在两个之间传输数据(双向) 通过 Wi-Fi Direct 连接的 Android 设备?
  2. 在我的在线研究中,我了解到从服务器发送数据 设备到客户端设备,服务器需要知道客户端的IP 地址。如何使用此客户端的 IP 地址从中发送数据 服务器设备到客户端设备? (我能够获取客户端的 IP 地址)

对于这些查询的任何建议,我将不胜感激。提前谢谢你。

代码: 服务器端

    public  class DataTransferAsyncTask extends AsyncTask<Void,Void,String>{
    ServerSocket serverSocket;

    Socket client;
    InputStream inputstream;
    Context context = mActivity.getApplicationContext();
    String s;
    InetAddress client_add;

    @Override
    protected String doInBackground(Void... voids) {

        try{

             serverSocket = new ServerSocket(9999);
            Log.e("hello", "Server: Socket opened");
            client = serverSocket.accept();
            Log.e("hello", "Server: connection done");

            inputstream = client.getInputStream();
        //  OutputStream outputStream = serverSocket.getO

            //getting data from client
            byte[] address = new byte[12];
            if(client.isConnected())
            inputstream.read(address);

             s = new String(address);
            String only_add = new String();
            only_add = s.substring(0,12);

             client_add = InetAddress.getByName(only_add);

            Log.e("hello", "Server: clients ip 1 " + only_add);
            Log.e("hello", "Server: converted address 1 " + client_add + " \n is connected"+
                    client.isConnected());




            //send data to client

            OutputStream stream = client.getOutputStream();

             stream.write(s.getBytes());
            Log.e("hello","context value "+context);




        //  cancel(true);



        }catch (IOException e){

        }
        return null;
    }

}

客户端:

@override
protected void onHandleIntent(Intent intent) {
    Log.e("hello","client socket");
    Toast.makeText(this,"client socket",Toast.LENGTH_LONG).show();
    Context context = getApplicationContext();
    if(intent.getAction().equals(action_send_data)){
        String host = intent.getStringExtra(group_owner_address);
        Socket socket = new Socket();
        int port = intent.getIntExtra(group_owner_port,9999);


        //binding connection
        try{

            String x="hello";
            Log.e("hello","opening client socket");
            byte[] address = getLocalAddress();
            String ipAdd = getDottedDecimalIP(address);

            socket.bind(null);
            socket.connect(new InetSocketAddress(host,port),socket_timeout);

            Log.e("hello","device socket address "+ socket.getInetAddress() );



            Log.e("hello","client socket is connected"+socket.isConnected());
            Log.e("hello","device address  :"+ipAdd + "  byte "+ address);

            //sending data to server
            OutputStream stream = socket.getOutputStream();

            stream.write(ipAdd.getBytes());


            //getting data from the server(supposed to)

            InputStream inputstream = socket.getInputStream();

            byte[] address_to_sto_fr_ser = new byte[15] ;
            inputstream.read(address_to_sto_fr_ser);

            String s = new String(address_to_sto_fr_ser);
            Log.e("msg from server","msg from server "+s);



          //  stream.close();
          //  is.close();


        }catch (IOException e){

        }
    }

}

最佳答案

客户端和 WiFi Direct 群组所有者之间的通信基于运行在群组所有者上的套接字服务器和连接到该服务器的客户端。

一旦 WiFi Direct 组形成(您可以通过检查“onConnectionInfoAvailable(WifiP2pInfo wifiP2pInfo)”知道),检查当前设备是否是组所有者,如果是,则启动套接字服务器(类似于您的代码):

mServerSocket = new ServerSocket(mPort);
Log.e(getClass().getSimpleName(), "Running on port: " + mServerSocket.getLocalPort());

接下来,添加这一行来接受连接并存储客户端套接字的引用:

Socket mSocket = mServerSocket.accept();

现在,您有了客户端套接字的引用,您可以使用它向它发送数据/消息。接下来,其他设备(客户端)应该发起到套接字服务器的连接:

mSocket = new Socket();
mSocket.bind(null);
mSocket.connect(new InetSocketAddress(mAddress, mPort), 500);

从服务器向客户端发送消息:

DataOutputStream mDataOutputStream = new DataOutputStream(mSocket.getOutputStream());

发送简单消息:

mDataOutputStream.writeUTF(message);
mDataOutputStream.flush();

希望这对您有所帮助。

关于android - 使用 Wi-Fi direct 的点对点数据共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41053544/

相关文章:

android - Admob 错误 : Not enough space to show ad. 需要 320x50 dp,但只有 309x0 dp

Android 自定义 EditText 在 ICS 中不显示光标

java - InputStream 读取字节数组 - 它会混合消息吗

java - 为什么套接字不会在服务器死机时死机?为什么当服务器还活着时套接字会死掉?

android - 如何更改 imageview 在 android 中的位置?

android - 我可以在 Android 上同时打开 Wi-Fi 和蜂窝网络接口(interface)吗?

java - 在android中的 ListView 中对连接的wifi进行排序

android - 使用addrow for MatrixCursor,如何添加不同的对象类型?

Android:将 View 带到对话框的前面

c++ - accept() block (有挂起的连接); Ctrl+C 解锁?