使用 Wi-Fi direct 进行点对点数据共享

Nar*_*esh 3 sockets android android-wifi wifi-direct

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

\n\n

问题

\n\n

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

\n\n

我有以下问题:

\n\n
    \n
  1. 还有其他方式传输数据吗(bi-directional)在通过 Wi-Fi Direct 连接的两个\nAndroid 设备之间传输数据?
  2. \n
  3. 在我的在线研究过程中,我了解到要将数据从服务器\n设备发送到客户端设备,服务器需要知道客户端\xe2\x80\x99s IP\n地址。如何使用此客户端\xe2\x80\x99s IP 地址将数据从\n服务器设备发送到客户端设备?(我能够获取客户端\xe2\x80\x99s IP\n地址)
  4. \n
\n\n

如果您对这些问题有任何建议,我将不胜感激。先感谢您。

\n\n

代码:\n 服务器端

\n\n
    public  class DataTransferAsyncTask extends AsyncTask<Void,Void,String>{\n    ServerSocket serverSocket;\n\n    Socket client;\n    InputStream inputstream;\n    Context context = mActivity.getApplicationContext();\n    String s;\n    InetAddress client_add;\n\n    @Override\n    protected String doInBackground(Void... voids) {\n\n        try{\n\n             serverSocket = new ServerSocket(9999);\n            Log.e("hello", "Server: Socket opened");\n            client = serverSocket.accept();\n            Log.e("hello", "Server: connection done");\n\n            inputstream = client.getInputStream();\n        //  OutputStream outputStream = serverSocket.getO\n\n            //getting data from client\n            byte[] address = new byte[12];\n            if(client.isConnected())\n            inputstream.read(address);\n\n             s = new String(address);\n            String only_add = new String();\n            only_add = s.substring(0,12);\n\n             client_add = InetAddress.getByName(only_add);\n\n            Log.e("hello", "Server: clients ip 1 " + only_add);\n            Log.e("hello", "Server: converted address 1 " + client_add + " \\n is connected"+\n                    client.isConnected());\n\n\n\n\n            //send data to client\n\n            OutputStream stream = client.getOutputStream();\n\n             stream.write(s.getBytes());\n            Log.e("hello","context value "+context);\n\n\n\n\n        //  cancel(true);\n\n\n\n        }catch (IOException e){\n\n        }\n        return null;\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

客户端:

\n\n
@override\nprotected void onHandleIntent(Intent intent) {\n    Log.e("hello","client socket");\n    Toast.makeText(this,"client socket",Toast.LENGTH_LONG).show();\n    Context context = getApplicationContext();\n    if(intent.getAction().equals(action_send_data)){\n        String host = intent.getStringExtra(group_owner_address);\n        Socket socket = new Socket();\n        int port = intent.getIntExtra(group_owner_port,9999);\n\n\n        //binding connection\n        try{\n\n            String x="hello";\n            Log.e("hello","opening client socket");\n            byte[] address = getLocalAddress();\n            String ipAdd = getDottedDecimalIP(address);\n\n            socket.bind(null);\n            socket.connect(new InetSocketAddress(host,port),socket_timeout);\n\n            Log.e("hello","device socket address "+ socket.getInetAddress() );\n\n\n\n            Log.e("hello","client socket is connected"+socket.isConnected());\n            Log.e("hello","device address  :"+ipAdd + "  byte "+ address);\n\n            //sending data to server\n            OutputStream stream = socket.getOutputStream();\n\n            stream.write(ipAdd.getBytes());\n\n\n            //getting data from the server(supposed to)\n\n            InputStream inputstream = socket.getInputStream();\n\n            byte[] address_to_sto_fr_ser = new byte[15] ;\n            inputstream.read(address_to_sto_fr_ser);\n\n            String s = new String(address_to_sto_fr_ser);\n            Log.e("msg from server","msg from server "+s);\n\n\n\n          //  stream.close();\n          //  is.close();\n\n\n        }catch (IOException e){\n\n        }\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

JAD*_*JAD 7

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

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

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

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

Socket mSocket = mServerSocket.accept();
Run Code Online (Sandbox Code Playgroud)

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

mSocket = new Socket();
mSocket.bind(null);
mSocket.connect(new InetSocketAddress(mAddress, mPort), 500);
Run Code Online (Sandbox Code Playgroud)

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

DataOutputStream mDataOutputStream = new DataOutputStream(mSocket.getOutputStream());
Run Code Online (Sandbox Code Playgroud)

发送简单消息:

mDataOutputStream.writeUTF(message);
mDataOutputStream.flush();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。