发送udp数据包时出现null错误 [英] null error in sending udp packets

查看:128
本文介绍了发送udp数据包时出现null错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我想通过wifi发送udp数据包。我使用下面的代码。

但我在LogCat中收到错误:发送空错误消息



BroadcastThread.java:

Hello, I want to send udp packets by wifi. I use below code.
But I get error in LogCat: error message in sending null

BroadcastThread.java:

public class BroadcastThread extends Thread{
	
	final static private String TAG = "Chat";
	final static boolean D = true;
	final static int PORT = 6666;
	
	boolean okbroadcast=false;

	Handler 		mHandler;      // Handler for messages in the main thread 
	Context 		mContext;	   // Context to the application (for getting ip Addresses)
	DatagramSocket 	serverSocket;  // Socket used both for sending and receiving 
	static public boolean 		socketOK=true; // True as long as we don't get socket errors
	
	InetAddress 	myBcastIPAddress; 		// my broadcast IP addresses
	InetAddress 	myIPAddress; 	
	
	
	public BroadcastThread(Context currentContext,	Handler handler)
	{
		mContext = currentContext;
		mHandler = handler;
		
		try{ // Let's open an UDP socket - we'll receive the messages on this socket
			serverSocket = new DatagramSocket(PORT);
			serverSocket.setBroadcast(true);
			Log.i(TAG,"server sicket is created.");
		} catch(Exception e){
			Log.e(TAG,"Cannot open socket! "+e.getMessage());
			socketOK = false;
			return;
		}
		
		try{
			getMyWiFiBcastAndIPAddress();
			Log.i(TAG,"My IP address:"+myIPAddress);
			Log.i(TAG,"My Broadcast IP address:"+myBcastIPAddress);
		}catch(Exception e){
			Log.e(TAG,"Cannot get my own Broadcast IP address");
		}
	}
	
	

	// Method for closing the socket before exiting application
	public void closeSocket(){
		serverSocket.close();
	}
	
	
	// If the socket is OK, then it's running
	boolean socketIsOK(){
	  return socketOK;
	}
	
	public void run(){
			
			if (okbroadcast==true)
				mHandler.obtainMessage(1,okbroadcast).sendToTarget();
if(!socketOK)
				closeSocket();
			
		}// end run()

		
		
		// Sends an UDP packet at the broadcast address
		public void sendMessage(String msg) throws IOException {
			
			Log.i(TAG,"string in thread= "+msg);
			
			byte[] sendData  = new byte[1024]; 

			sendData = msg.getBytes(); 
			
			Log.i(TAG,"to byte[] in thread= "+sendData);

			DatagramPacket sendPacket = 
				new DatagramPacket(sendData, sendData.length, myBcastIPAddress, PORT); 
			
			Log.i(TAG,"byte[] length in thread= "+sendData.length);
			
			
			if(sendData==null)
				Log.i(TAG,"sendData is null! "+sendData);
			
			
			if(serverSocket==null)
				Log.i(TAG,"serversocket is null! "+serverSocket);

			serverSocket.send(sendPacket);
			
			Log.i(TAG,"after sending........ ");
			okbroadcast=true;
	        Log.i(TAG,"Sent packet: "+msg);
	        
	        closeSocket();

		}
		
		
		
		private void getMyWiFiBcastAndIPAddress() throws UnknownHostException{

	        WifiManager mWifi = (WifiManager) (mContext.getSystemService(Context.WIFI_SERVICE));
	        WifiInfo info = mWifi.getConnectionInfo();
	        if(info==null){
	            if(D) Log.e(TAG,"Cannot Get WiFi Info");
	            return;
	        }
	        else{
	        	if(D) Log.d(TAG,"\n\nWiFi Status: " + info.toString());
	        }
			  
	  	  // DhcpInfo  is a simple object for retrieving the results of a DHCP request
	        DhcpInfo dhcp = mWifi.getDhcpInfo(); 
	        if (dhcp == null) { 
	          Log.d(TAG, "Could not get dhcp info"); 
	          return; 
	        } 


	        int myIntegerIPAddress = dhcp.ipAddress;

	        byte[] quads = new byte[4]; 
	        for (int k = 0; k < 4; k++) 
	           quads[k] = (byte) ((myIntegerIPAddress>> k * 8) & 0xFF);

	        myIPAddress = InetAddress.getByAddress(quads);

	        
	        int myIntBroadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask; 
	        for (int k = 0; k < 4; k++) 
	          quads[k] = (byte) ((myIntBroadcast >> k * 8) & 0xFF);
	        
	        // Returns the InetAddress corresponding to the array of bytes. 
	        myBcastIPAddress=InetAddress.getByAddress(quads); 
	    	
	    }
	    	
		

}





< br $>


和活动目录.java:







and in activity Directory.java:

public class Directory extends Activity {
	
	Utility ut=new Utility();
	BroadcastThread 	broadThread;
	ArrayAdapter	<String>receivedMessages;
	
	
	
	private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
	            
	                String incomingMessage = (String) msg.obj;
	                Toast.makeText(getApplicationContext(), "in hendler: "+incomingMessage, Toast.LENGTH_LONG).show();
	                Log.i("vote", "in hendler: "+incomingMessage);
	                
	                if(!incomingMessage.matches(""))   
	                {
	                	BroadcastThread.socketOK=false;
	                }
            
        }
    };    
	
	
	
	//Events
		btn_create_session.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
			
				
				
				// Start my server thread
		        broadThread = new BroadcastThread(getApplicationContext(),mHandler);

		        //Check if it's running
		        if (!broadThread.socketIsOK()){
		     	   Log.e("vote","Server NOT STARTED");
		     	   Toast.makeText(getApplicationContext(), "Cannot Start Server ", Toast.LENGTH_LONG).show();
		     	   return;
		         }

		        // All appears to be OK, start the main loop
		        broadThread.start();
		         Log.i("vote","Server Started");
		        
		        
		         try{
		        	
		     		broadThread.sendMessage("namekey");
		     		
		     		 
		     	}catch(Exception e){
		     		Toast.makeText(Directory.this, "Cannot send message"+e.getMessage(), Toast.LENGTH_LONG).show();
		     		Log.e("vote","error message in sending: "+e.getMessage());
		     	}
		     	
		     	finally{
		     		broadThread.closeSocket();
		     	}
				
			}
		});

推荐答案

在BroadCastThread中你有以下:

In BroadCastThread you have the following:
if(serverSocket==null)
    Log.i(TAG,"serversocket is null! "+serverSocket);

serverSocket.send(sendPacket);



但是如果 serverSocket 为null,则最后一行将导致NullReference异常。


But if serverSocket is null the last line will cause a NullReference exception.


这篇关于发送udp数据包时出现null错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆