title: Peer to peer data sharing using Wi-Fi direct
body: <p>I am developing an Android multiplayer game using <code>Wi-Fi direct</code>. 
  Using Wi-Fi direct, I am able to establish connection between peer devices. Also the code is able to send the data from client device to server device. (According to Android documentation, the Wi-Fi direct uses client-server model)</p>
  
  <p><strong>Problem</strong>:</p>
  
  <p>I am not able to share the data from server device to client device using Wi-Fi direct.</p>
  
  <p>I have following questions:</p>
  
  <ol>
  <li>Is there any other way to transfer data <code>(bi-directional)</code> between two
  Android devices which are connected through Wi-Fi Direct?</li>
  <li>During my online research I understood that to send data from server
  device to client device, server needs to know the client’s IP
  address. How to use this client’s  IP address to send data from
  server device to client device? (I am able to fetch the client’s IP
  address)</li>
  </ol>
  
  <p>I'd appreciate any suggestions on these queries. Thank you in advance.</p>
  
  <p>Code:
    Server Side</p>
  
  <pre><code>    public  class DataTransferAsyncTask extends AsyncTask&lt;Void,Void,String&gt;{
      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;
      }
  
  }
  </code></pre>
  
  <p>Client Side: </p>
  
  <pre><code>@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){
  
          }
      }
  
  }
  </code></pre>