Android下UDP通信DEMO
安卓下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;@Overrideprotected 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() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubtosend=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 blocke.printStackTrace();Log.e(me,"发送失败");}}});//mHandlernew 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 blocke.printStackTrace();Log.e(me,"接收失败");}//catch }//while }//run }).start();//new Thread(new Runnable(){ }//onCreatestatic 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是广播,所有人都能收到这个消息
更多相关文章
- “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
- Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- Android(安卓)3.0系统上 解密GMail动画
- android中ContactsContract获取联系人的方法
- Android查看数据库工具sqlitemanager
- Android(安卓)SharedPreferences
- Android之WebView缓存应用
- android 3D 游戏实现之综合实例(初步)