Android下UDP通信DEMO

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzcggg/article/details/24472595

安卓下UDP通信比较简单,流程如下

发送方:

1.  创建DatagramSocket对象:

  DatagramSocket dsocket;

2.  创建 InetAddress , 相当于是地址

InetAddress serverAddress; 

3.  这是随意发送一个数据

String tosend;

4.  转为byte类型

byte data[] = tosend.getBytes();

5.  创建DatagramPacket 对象

DatagramPacket outgoing = new DatagramPacket (data , data.length , serverAddress, port);

6.  调用DatagramSocket对象的send方法 发送数据  

dsocket . send(outgoing );

接收方:

1.  创建一个DatagramSocket对象,并指定监听的端口号

DatagramSocket dsocket = new DatagramSocket(port);

2. 创建一个byte数组用于接收

byte data[] = new byte[1024];

3. 创建一个空的DatagramPackage对象

 DatagramPacket incoming = new DatagramPacket (data , data.length);

4. 使用receive接收数据,同时这也是一个阻塞的方法

dsocket.receive(incoming ); 

5. 得到发送过来的数据

new String(incoming .getData() , incoming .getOffset() , incoming .getLength());

 

源码如下:

 
package com.example.testudp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

	static TextView show;
	EditText input;
	Button send;	
	
	/**调试信息标签*/
	String me="MainActivity";
	/**数据流*/
	DatagramSocket dsocket;
	/**接收的数据*/
	byte data[] = new byte[1024];
	/**接收的数据包*/
	DatagramPacket incoming;
	/**发送的数据包*/
	DatagramPacket outgoing;
	/**设置发送IP(host)*/
	InetAddress serverAddress ;//= InetAddress.getByName("255.255.255.255");
	/**接收到的消息*/
	static String message;
	/**发送的消息*/
	String tosend;
	/**发送目的IP*/
	String ip2go="255.255.255.255";
	/**监听的端口*/
	int port=2001;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		show=(TextView)findViewById(R.id.info);
		input=(EditText)findViewById(R.id.input);
		send=(Button)findViewById(R.id.send);		
		
		show.setText("");
		
		 try {
         			dsocket = new DatagramSocket(port);
         		} catch (SocketException e) {
         			// TODO Auto-generated catch block
         			e.printStackTrace();
         			Log.e(me,"创建连接失败");
         		}
         		try {
         			serverAddress = InetAddress.getByName(ip2go);
         		} catch (UnknownHostException e) {
         			// TODO Auto-generated catch block
         			e.printStackTrace();
         			Log.e(me,"设置发送端失败");
         		}
		
		incoming=new DatagramPacket(data, data.length);
		
		
		
		send.setOnClickListener(new OnClickListener() {			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				tosend=input.getText().toString();
				show.setText(show.getText()+"ME:"+tosend+"\n");
					byte[] senddata=tosend.getBytes();					
					outgoing=new DatagramPacket(senddata, senddata.length,serverAddress,port);
				try {
					//感谢如下网页提供帮助
					//http://dev.wo.com.cn/docportal/doc_queryMdocDetail.action?mdoc.docindex=6695#
					StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
					StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
					//以上为辅助代码
				  dsocket.send(outgoing);				
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					Log.e(me,"发送失败");
				}
			}
		});

		//mHandler
		new Thread(new Runnable(){
             @Override
             public void run() {            	
            	Log.e(me,"start");
            	while(true){
	            	try {   
						dsocket.receive(incoming);
						message=new String(incoming.getData() , incoming.getOffset() , incoming.getLength());
						if(message.equals(tosend))
						{
							Log.e(me,"this is what you send -> "+message);
						}else{
							Log.e(me,"get="+message);
							mHandler.obtainMessage(FRESH_UI).sendToTarget();
						}	            	
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
						Log.e(me,"接收失败");
					}//catch
            	}//while
             }//run
         }).start();//new Thread(new Runnable(){
		 
		 
	}//onCreate
	

	static final  int FRESH_UI=1990;
	private static Handler mHandler = new Handler(){ 
	    @Override
	    public void handleMessage(Message msg)
	    {
	    	switch(msg.what)
	    	{
	    	case FRESH_UI:
	    		show.setText(show.getText()+"GET:"+message+"\n");
	    		break;
	    	default:
	    		break;
	    	}//switch
	    }//handler
	};
	

}
上面的线程只是用来接收,不喜欢可以换成Handler。

布局文件就按键、edittext、textview各一个。

manifest里添加网络相关的权限即可。

废话一下,关于目的IP,四个255是广播,所有人都能收到这个消息

猜你喜欢

转载自blog.csdn.net/lzcggg/article/details/24472595