我創建了一個允許通過本地wifi發送數據的應用程序。首先,我試圖恢復我的IP地址和我在哪裏的域,它工作正常(我用Log.d驗證過)。Android UDP通過本地wifi進行通信
這是類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();
}
}
此外,我創造了這個服務來運行ServerThread:
公共類ChatService延伸服務{
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);
}
}
在我的活動(叫集體活動)我創建了方法SendMessage:
private void sendMessage(String address, String msg, boolean bcast) {
wifi.ClientThread cThread;
cThread = new wifi.ClientThread(address, msg, 5555, bcast);
cThread.start();
}
而我把它叫做按鈕「提交」被點擊時:
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("");
}
}) ;
,我並沒有忘記廣播接收器:
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);
}
});
}
}
};
而且finnaly,這些都是其他方法我的活動:
public void onResume() {
super.onResume();
registerReceiver(broadcastReceiver, new IntentFilter(ChatService.BROADCAST_ACTION));
}
public void onPause() {
super.onPause();
unregisterReceiver(broadcastReceiver);
}
public void onDestroy() {
super.onDestroy();
}
當我運行應用程序,我不能發送/接收任何消息,並在兩個警告在LO g:
java.lang.NullPointerException
at wifi.ClientThread.run(ClientThread.java:31)
我想知道這是什麼問題,我該如何糾正它。 謝謝
請提供線整個堆棧跟蹤和源極線數'公共無效的run(){',使我們可以在與那些在該方法中的跟蹤涉及的行號。 – scottt
問題是在包含的線 ChatService.socket.send(packet1); –