Reputation: 31
I have created an application which allows sending datas via local wifi. First, I tried to recuperate my ip address and the domain where i am in and it worked correctly (i verified it with Log.d).
This is the class ClientThread:
import java.net.DatagramPacket;
import java.net.InetAddress;
public class ClientThread extends Thread implements Runnable{
String address;
String message;
int port;
boolean broadcast;
public ClientThread(String address, String message, int port,boolean broadcast)
{ super();
this.address = address;
this.message = message;
this.port = port;
this.broadcast = broadcast;
}
public void run() {
try {
DatagramPacket packet1 = new DatagramPacket(message.getBytes()
, message.length(), InetAddress.getByName(address), port);
ChatService.socket.send(packet1);
} catch (Exception e) {
e.printStackTrace();
}
}
Besides, I have created this service to run the ServerThread:
public class ChatService extends Service{
public static DatagramSocket socket;
private ServerThread sThread;
public static String serverIP;
public static final int SERVERPORT = 5555;
private Handler handler = new Handler();
private ServerSocket serverSocket;
public static final String BROADCAST_ACTION = "UpdateEvent";
static Intent intent;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
try {
socket = new DatagramSocket(SERVERPORT);// initialisation du datagramme UDP
sThread = new ServerThread();
sThread.start();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public class ServerThread extends Thread implements Runnable{
public void run() {
try {
serverIP = getLocalIpAddress();
Log.v("addr", serverIP);
if (serverIP != null) {
serverSocket = new ServerSocket(SERVERPORT);
Log.v("socket", "created");
while(true) { //boucle infini
Socket client = serverSocket.accept();
Log.v("client", "received");
try {
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
ChatService.socket.receive(packet);
byte[] result = new byte[packet.getLength()];
System.arraycopy(packet.getData(), 0, result, 0, packet.getLength());
String msg = new String(result);
updateGui(msg, packet.getAddress());
ChatService.socket.close();
} catch (Exception e) {
}
}
}
} catch (Exception e) {}
}
private String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); }
}
}
} catch (SocketException ex) {
Log.e("ServerActivity", ex.toString());
}
return null;
}
public void updateGui(String msg, InetAddress addr) {
intent = new Intent(BROADCAST_ACTION);
intent.putExtra("message", msg);
intent.putExtra("senderAddr", addr.toString().substring(1, addr.toString().length()));
if(msg.substring(0, 4).equals("idfu"))
{
CollectiveActivity.receiverAddr = addr.toString().substring(1, addr.toString().length());
}
sendBroadcast(intent);
}
}
In my activity (Called CollectiveActivity) I i created the methode SendMessage :
private void sendMessage(String address, String msg, boolean bcast) {
wifi.ClientThread cThread;
cThread = new wifi.ClientThread(address, msg, 5555, bcast);
cThread.start();
}
And the i called it when the button "Submit" was clicked:
Button submit = (Button) findViewById(R.id.Button);
submit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
chatArea.append(Html.fromHtml("<font color='red' style='bold'>"+User.username+": </font>"));
chatArea.append(Html.fromHtml("<font color='black'>"+textBox.getText()+"</font> <br/>"));
sendMessage("192.168.93.103", "mssg"+User.username+": "+textBox.getText().toString(), true);
textBox.setText("");
}
}) ;
And i didn't forget the BroadcastReceiver:
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.v("msg", "received");
String message = intent.getStringExtra("message");
String code = message.substring(0, 4); // message= code(4) + msg
String msg = null;
if(message.length()>4) msg = message.substring(4, message.length());
if(code.equals("idfr"))
{
if(receiverAddr != null)
{
// si qq entre à la chambre de chat
addUser(msg, intent.getStringExtra("senderAddr"));
Toast toast = Toast.makeText(CollectiveActivity.this, msg+" entered chat room", 1000);
toast.show();
sendMessage(receiverAddr, "idfu"+DataUser.User.username, false);
}
}
else if(code.equals("idfu"))
{
addUser(msg, intent.getStringExtra("senderAddr"));
Toast toast = Toast.makeText(CollectiveActivity.this, msg+" entered chat room", 1000);
toast.show();
Log.v("user added with name and address", msg + " " + intent.getStringExtra("senderAddr"));
}
else if(code.equals("mssg"))
{
int temp = 0;
while(msg.charAt(temp)!=' ') temp++;
sender+' '+message1
String sender;
String message1;
sender = msg.substring(0, temp);
message1 = msg.substring(temp, msg.length());
chatArea.append(Html.fromHtml("<font color='red'>"+sender+" </font>"));
chatArea.append(Html.fromHtml("<font color='black'>"+message1+"</font> <br/>"));
scrollView.post(new Runnable() {
public void run() {
scrollView.fullScroll(View.FOCUS_DOWN);
}
});
}
}
};
And finnaly, these are the others methods of my activity:
public void onResume() {
super.onResume();
registerReceiver(broadcastReceiver, new IntentFilter(ChatService.BROADCAST_ACTION));
}
public void onPause() {
super.onPause();
unregisterReceiver(broadcastReceiver);
}
public void onDestroy() {
super.onDestroy();
}
When i run the application , i can't send/receive any message and there is two warning in the log:
java.lang.NullPointerException
at wifi.ClientThread.run(ClientThread.java:31)
I would like to know what's is the problem, i how can i correct it. Thanks
Upvotes: 2
Views: 1802
Reputation: 31
Thank you Scott, finnaly i could fix it simply !! it just a problem of creating the serversocket. I added a DatagramPacket as an attribut in the ClientThread, and i changed the constructor. .
public class ClientThread extends Thread implements Runnable{
String address;
String message;
int port;
boolean broadcast;
public DatagramSocket socket;
public ClientThread(String address, String message, int port,boolean broadcast, DatagramSocket socket)
{ super();
this.address = address;
this.message = message;
this.port = port;
this.broadcast = broadcast;
this.socket = socket;
}
public void run() {
try {
DatagramPacket packet1 = new DatagramPacket(message.getBytes(), message.length(), InetAddress.getByName(address), port);
socket.send(packet1);
} catch (Exception e) {
e.printStackTrace();
}
socket.close();
}
}
Upvotes: 1
Reputation: 8371
I would log out all the relevant values; one of them doesn't have a value. So perhaps:
Log.v(TAG, String.format("message is [%s]; it's size is %d", message, message.length())); Log.v(TAG, String.format("address is [%s]; it's size is %d", address, address.length()));
Log.v(TAG, String.format("port is %d", address, port));
Log.v(TAG, String.format("InetAddress is [%s]", InetAddress.getByName(address), port)));
Log.v(TAG, String.format("packet1 is [%s]; it's size is %d", packet1, packet1.length()));
Log.v(TAG, String.format("socket is [%s]", ChatService.socket.toString()));
Alternatively, you could run this via the debugger. That would really let you see what's going on.
Upvotes: 1