`

android >UDP 通讯

阅读更多

首先是发送 

 

 

 

package remote.com;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.nio.Buffer;
import java.util.ArrayList;
import java.util.List;

import udpreceive.com.UdpReceive;


import android.app.Activity;
import android.content.Intent;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class RemoteActivity extends Activity {
    /** Called when the activity is first created. */
	private Button start_button;
	private Button end_button;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        start_button = (Button)findViewById(R.id.start_bu);
        end_button = (Button)findViewById(R.id.end_bu);
        
        Intent intent = new Intent();
        intent.setClass(RemoteActivity.this, UdpReceive.class);
        RemoteActivity.this.startService(intent);
        
        	
        System.out.println("mian activity thread = " +  Thread.currentThread().getId());
        
        
        start_button.setOnClickListener(new View.OnClickListener() {			       	
			public void onClick(View v) {	
				
				// TODO Auto-generated method stub
		        int server_port = 60000;  
		        String server_addr = "192.168.1.233"; 		                
		        String aa = "aa";	        	         
		        try {	        	
		    		byte[] bytesa = aa.getBytes();
		    		int bytesa_len = bytesa.length;
					DatagramSocket socket = new DatagramSocket(server_port); 
					InetAddress local = InetAddress.getByName(server_addr);					
					DatagramPacket sendSocket = new DatagramPacket(bytesa, bytesa_len, local, server_port);
					socket.send(sendSocket);				
					System.out.println("send success");
					socket.close();  //很关键, 发完后必须cloas 不然再点就发不了了
				} catch (Exception e) {  
					// TODO: handle 
				}		
		        
		        System.out.println("main activity thread id = " + Thread.currentThread().getId());
		        
			}
			
			
		});   
        end_button.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				// TODO Auto-generated method stub
		        Intent intent = new Intent();
		        intent.setClass(RemoteActivity.this, UdpReceive.class);
		        RemoteActivity.this.stopService(intent);
			}
		});

    
        //
        
        
    }


    //////
    
}

 

 

 

然后是接收 ,接收 是新建了一个线程 , new thread.start

package cfg.mft;


import gloabal.mft.MyApplication;

import java.io.IOException;
import java.net.BindException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.MulticastLock;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;

public class CfgUdpReceive extends Service{
	private boolean threadDisable;
	private int count;	
	MyApplication app;   
	WifiManager wifi;
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub  
		return null;
	} 
	
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		System.out.println( "到了UdpReceive了"); 
		new Thread(new ServerThread()).start();
		
	}	
	class ServerThread extends Thread{        
        public void run(){  
            Log.d("UDP Demo","到了里面了");  
            while (true) {
                // UDP服务器监听的端口   
            	try {
                    DatagramSocket socket = new DatagramSocket(15001);  
                    byte data [] = new byte[1024];  
                    //创建一个空的DatagramPacket对象  
                    DatagramPacket packet = new DatagramPacket(data,data.length);  
                    //使用receive方法接收客户端所发送的数据    
                    if(socket == null){
                    	break;
                    }
                    wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
                    MulticastLock ml = wifi.createMulticastLock("just some tag text");
                    ml.acquire();
                    //
	                socket.receive(packet);  
	                String result = new String(packet.getData(),packet.getOffset(),packet.getLength());  
	                Log.d("log", "收到udpReceive");
	                //System.out.println("result--->" + result + "\n" + " now thread id = " + Thread.currentThread().getId());  
	                
	                app = (MyApplication) getApplication();
	                app.setName(1);
	                ml.release();
	                
	                socket.close();
                    
                    
				} catch (Exception e) {
					// TODO: handle exception
				}
            }

  
        }  
    }  
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        this.threadDisable = true;
        Log.v("CountService", "on destroy");
    }

    public int getCount() {
        return count;
    }

	
}

 

 

然后是 manifest 里面添加权限

 

<uses-permission android:name="android.permission.INTERNET"/>

 

 

--

关于HTC 手机不能接收 问题  在 while 前 执行 下面的

WifiManager wifi;
wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
MulticastLock ml = wifi.createMulticastLock("just some tag text");
ml.acquire();

如果 执行完了, 在 while 里面的 最后 执行

ml.release();
                //创建一个DatagramSocket对象,并指定监听的端口号  
                DatagramSocket socket = new DatagramSocket(15001);  
                byte data [] = new byte[1024];  
                //创建一个空的DatagramPacket对象  
                DatagramPacket packet = new DatagramPacket(data,data.length);  
                //使用receive方法接收客户端所发送的数据    
                
                wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
                MulticastLock ml = wifi.createMulticastLock("just some tag text");
                ml.acquire();

                while (true) {
	                socket.receive(packet);  
	                String result = new String(packet.getData(),packet.getOffset(),packet.getLength());  
	                //System.out.println("result--->" + result + "\n" + " now thread id = " + Thread.currentThread().getId());  
	                
	                app = (MyApplication) getApplication();
	                app.setName(1);
	                ml.release();
                }

 

---

 

 

如果在虚拟机里面 搞不定, 不能接收 UDP 通知, 那需要 改 下 ip端口

 

解决方法:
1. 运行模拟器
2. 打开window 命令行
    执行:telnet localhost 5554 或者是 telnet 127.0.0.1  5554 
   5554是模拟器的端口,执行之后会进入android console
3. 在console下执行:

redir add udp :端口号:端口号

例如:
   redir add udp:22221:22221
   其中,第一个端口号是模拟器1的端口,第二个端口号是模拟器2端口。(端口映射)
   执行此命令之后,会把模拟器 22221 端口发送的数据通过本机转到模拟器的22221端口,就能从22221端口接收UDP数据包了

-----------------------------------------------------------------------------

此外以上的做法有个个确定就是 在 接收的时候 要指定 端口 ,下面这个 接收方式 在同一个socket 下面就不用 在接收的时候指定端口了

    class ServerThread extends Thread{    	
    	public void run(){
	        int server_port = 8257;  
	        String server_addr = "192.168.1.233";            
	        String aa = "aaaa";	        	         
	        try {	        	
	    		byte[] b = aa.getBytes();
	    		int b_len = b.length;
				socket = new DatagramSocket(server_port); 
				InetAddress local = InetAddress.getByName(server_addr);					
				DatagramPacket sendSocket = new DatagramPacket(b, b_len, local, server_port);			
				socket.send(sendSocket);				
				System.out.println("send success" );                   
		
			} catch (Exception e) {  
				// TODO: handle 
				e.printStackTrace();
			}	   		
	        byte buff[]=new byte[1024];
	        DatagramPacket receivePacket=new DatagramPacket(buff,buff.length); 
	        try {
	        	socket.setSoTimeout(5000);  		//设置接收延迟, 即 当发送后的多少时间内没有返回的话就无效 
	        	socket.receive(receivePacket);
	        	
	        	String result = new String(receivePacket.getData(),receivePacket.getOffset(),receivePacket.getLength());
	        	
	        	
	        	String rr = bin2hex(result);
	        	System.out.println("result--->" + rr + "\n" + " now thread id = " + Thread.currentThread().getId());
			} catch (Exception e) {
				// TODO: handle exception
				socket.close(); 
			}
	        
	        //////////
    	}
    }	

 

 

如果是接收多个UDP 包

 

    	 try {
	        	socket.setSoTimeout(5000);  		////设置接收延迟, 即 当发送后的多少时间内没有返回的话就无效 
	        	
	        	String re = "";
	        	
	        	try {
		        	while (true) {
		        		re = re + "[";
		        		
		        		socket.receive(receivePacket);
		        		repacs=receivePacket.getData();
		        		int effLength=receivePacket.getLength();
			        	repac=new byte[effLength];		        	
			        	
			        	for (int i = 0; i < effLength; i++) {
			        		
			        		re = re + to16(repacs[i]);
			        		
						}			        	
			        	re = re + "]";
					}
	        	}catch (Exception e) {
	    			// TODO: handle exception
	       	 	}        	
	        	socket.close();
	        	re=re.substring(0, re.length()-1);
	        	System.out.println("result--->" + re );  
	        	return re.toString();
    	 } catch (Exception e) {
			// TODO: handle exception
    	 }
    	 socket.close();

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics