'Creating P2P Connections with Wi-Fi : Message passing issue
I'm working with Wifi P2P Connection to send and receive messages between two Android Devices using below tutorials
https://developer.android.com/training/connect-devices-wirelessly/wifi-direct.html
https://developer.android.com/guide/topics/connectivity/wifip2p.html
it is working to identify nearby devices and connecting with nearby peer.But in my code after connection success between Server and Client, Client peer is sending message to Server peer successfully after that Server peer is unable to send message to Client peer and its giving the below exception
04-14 12:31:27.740: E/test(6037): SERVER to CLIENT message sending exception: bind failed: EADDRINUSE (Address already in use)
Please help to find what is the problem with my code
this is my MainActivity.java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.net.wifi.p2p.WifiP2pConfig;
import android.net.wifi.p2p.WifiP2pDevice;
import android.net.wifi.p2p.WifiP2pDeviceList;
import android.net.wifi.p2p.WifiP2pInfo;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pManager.ActionListener;
import android.net.wifi.p2p.WifiP2pManager.Channel;
import android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener;
import android.net.wifi.p2p.WifiP2pManager.PeerListListener;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener, PeerListListener, ConnectionInfoListener{
WifiP2pManager mManager;
Channel mChannel;
private List<WifiP2pDevice> peers = new ArrayList<WifiP2pDevice>();
BroadcastReceiver mReceiver;
IntentFilter mIntentFilter;
private BroadcastReceiver receiver = null;
private WifiP2pInfo info;
String groupOwnerAddress;
ListView listPeers;
TextView mTextDeviceName, mTextStatus, mTextGroupOwner;
EditText mEditText_message;
Context context;
static String toastmessage;
static String message = "";
boolean isPeerServer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = MainActivity.this;
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
mChannel = mManager.initialize(this, getMainLooper(), null);
mReceiver = new WifiP2PBroadCast(mManager, mChannel, this);
mIntentFilter = new IntentFilter();
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
findViewById(R.id.button_search).setOnClickListener(this);
findViewById(R.id.button_send).setOnClickListener(this);
listPeers = (ListView) findViewById(R.id.list_peers);
mTextDeviceName = (TextView) findViewById(R.id.text_device_name);
mTextStatus = (TextView) findViewById(R.id.text_Status);
mTextGroupOwner = (TextView) findViewById(R.id.text_group_owner);
mEditText_message = (EditText) findViewById(R.id.edittext_message);
listPeers.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
// TODO Auto-generated method stub
connectWithPeers(position);
}
});
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
receiver = new WifiP2PBroadCast(mManager, mChannel, this);
registerReceiver(mReceiver, mIntentFilter);
discoverPeers();
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(mReceiver);
}
public void updateDeviceInfo(WifiP2pDevice device) {
mTextDeviceName.setText(device.deviceName);
mTextStatus.setText(getDeviceStatus(device.status));
}
private static String getDeviceStatus(int deviceStatus) {
switch (deviceStatus) {
case WifiP2pDevice.AVAILABLE:
return "Available";
case WifiP2pDevice.INVITED:
return "Invited";
case WifiP2pDevice.CONNECTED:
return "Connected";
case WifiP2pDevice.FAILED:
return "Failed";
case WifiP2pDevice.UNAVAILABLE:
return "Unavailable";
default:
return "Unknown";
}
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button_search:
discoverPeers();
break;
case R.id.button_send:
sendMessage();
break;
default:
break;
}
}
public void discoverPeers(){
mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Log.e("test", "Discovering Peers Success..");
if (mManager != null) {
mManager.requestPeers(mChannel, MainActivity.this);
}
}
@Override
public void onFailure(int reasonCode) {
Log.e("test", "Discovering Peers Fail..");
}
});
}
public void connectWithPeers(int id) {
WifiP2pDevice device = peers.get(id);
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = device.deviceAddress;
mManager.connect(mChannel, config, new ActionListener() {
@Override
public void onSuccess() {
//success logic
Log.e("test", "Connection with peer Success..");
}
@Override
public void onFailure(int reason) {
//failure logic
Log.e("test", "Connection with peer Failed..");
}
});
}
public void sendMessage() {
if (!isPeerServer) {
//Client Peer
Toast.makeText(MainActivity.this, "client sending message", Toast.LENGTH_SHORT).show();
new SendMessage().execute(MainActivity.this);
} else {
//Server Peer
Toast.makeText(MainActivity.this, "server sending message", Toast.LENGTH_SHORT).show();
new FileServerAsyncTask(this, "").execute();
}
}
//Send message form client to server
public class SendMessage extends AsyncTask {
@Override
protected Object doInBackground(Object... arg0) {
// TODO Auto-generated method stub
try {
message = mEditText_message.getText().toString();
Socket socket = new Socket(info.groupOwnerAddress.getHostAddress(), 8988);
//Send the message to the server
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
String number = message;
String sendMessage = number + "\n";
bw.write(sendMessage);
bw.flush();
Log.e("test", "Message sent to the server : "+sendMessage);
//Get the return message from the server
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String message = br.readLine();
Log.e("test", "Message received from the server : " +message);
socket.close();
}catch(IOException e){
Log.e("test", "CLIENT to SERVER message sending exception: "+e.getMessage());
}finally {
}
return null;
}
@Override
protected void onPostExecute(Object result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Toast.makeText(MainActivity.this, "MESSAGE: "+message, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onConnectionInfoAvailable(WifiP2pInfo wifiP2pInfo) {
// TODO Auto-generated method stub
Log.e("test", "..onConnectionInfoAvailable..");
info = wifiP2pInfo;
try {
groupOwnerAddress = wifiP2pInfo.groupOwnerAddress.getHostAddress();
} catch (Exception e) {
// TODO: handle exception
Log.e("test", "Owner Info null");
}
if (info.groupFormed && info.isGroupOwner) {
Log.e("test", "GOT INFORMATION FROM PEERS..");
new FileServerAsyncTask(this, "").execute();
}
if (wifiP2pInfo.isGroupOwner) {
isPeerServer = true;
} else {
isPeerServer = false;
}
mTextGroupOwner.setText("Is group owner? ---- "+((wifiP2pInfo.isGroupOwner == true) ? "yes" : "no"));
}
@Override
public void onPeersAvailable(WifiP2pDeviceList peerList) {
// TODO Auto-generated method stub
Log.e("test", "NUMBER OF PEERS AVAILABLE: ----- "+peerList.getDeviceList().size());
peers.clear();
peers.addAll(peerList.getDeviceList());
String[] devices = new String[peerList.getDeviceList().size()];
for (int i = 0; i < devices.length; i++) {
devices[i] = peers.get(i).deviceName.toString();
}
try {
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, R.layout.simplerow, devices);
listPeers.setAdapter(adapter);
}catch (Exception e) {
// TODO: handle exception
Log.e("test", "EXCEPTION: "+e.toString());
}
}
//Send message form server to client
public class FileServerAsyncTask extends AsyncTask<Object, Object, Object> {
private Context context;
String message;
public FileServerAsyncTask(Context context, String statusText) {
this.context = context;
}
@Override
protected Object doInBackground(Object... arg0) {
// TODO Auto-generated method stub
Socket socket = null;
try {
ServerSocket serverSocket = new ServerSocket(8988);
//Reading the message from the client
socket = serverSocket.accept();
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String number = br.readLine();
toastmessage = number;
Log.e("test", "Message received from client is "+number);
//Multiplying the number by 2 and forming the return message
String returnMessage;
returnMessage = "Return message from Server..";//String.valueOf(returnValue) + "\n";
//Sending the response back to the client.
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
bw.write(returnMessage);
Log.e("test", "Message sent to the client is "+returnMessage);
bw.flush();
}catch (Exception e){
Log.e("test", "SERVER to CLIENT message sending exception: "+e.getMessage());
}finally {
try{
socket.close();
}
catch(Exception e){}
}
return null;
}
@Override
protected void onPostExecute(Object result) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "Message from Client: "+toastmessage, Toast.LENGTH_SHORT).show();
}
}
}
and here is my WifiP2PBroadCast.java
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.p2p.WifiP2pDevice;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pManager.Channel;
public class WifiP2PBroadCast extends BroadcastReceiver{
private WifiP2pManager mManager;
private Channel mChannel;
private MainActivity activity;
public WifiP2PBroadCast(WifiP2pManager manager, Channel channel, MainActivity activity) {
// TODO Auto-generated constructor stub
super();
this.mManager = manager;
this.mChannel = channel;
this.activity = activity;
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
// Respond to new connection or disconnections
mManager.requestConnectionInfo(mChannel, activity);
} else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
// Respond to this device's wifi state changing
activity.updateDeviceInfo((WifiP2pDevice) intent.getParcelableExtra(
WifiP2pManager.EXTRA_WIFI_P2P_DEVICE));
}
}
}
and here is AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.suresh.wifi_p2p_demo"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="25" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Solution 1:[1]
If you have this error when you receive a message
You need to remove the group in use to continue
mManager.removeGroup(mChannel, null);
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Keke |