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

时间:2016-12-09 05:15:25

标签: android sockets android-wifi wifi-direct

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

问题

我无法使用Wi-Fi直接从服务器设备与客户端设备共享数据。

我有以下问题:

  1. 还有其他方法可以在两者之间传输数据(bi-directional) 通过Wi-Fi Direct连接的Android设备?
  2. 在我的在线研究期间,我理解从服务器发送数据 设备到客户端设备,服务器需要知道客户端的IP 地址。如何使用此客户端的IP地址从中发送数据 服务器设备到客户端设备? (我能够获取客户端的IP 地址)
  3. 我很感激有关这些查询的任何建议。提前谢谢。

    代码:   服务器端

        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){
    
            }
        }
    
    }
    

1 个答案:

答案 0 :(得分:2)

客户端与WiFi Direct Group Owner之间的通信基于在Group Owner上运行的Socket服务器和连接到该服务器的客户端。

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

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();

希望这有帮助。

相关问题