安卓下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是广播,所有人都能收到这个消息