要实现UDP通信,我们先来简单了解一下UDP协议
UDP和TCP一样是用来处理数据包的协议,但它和TCP又不一样:
1.UDP是无连接协议,客户端和服务器通信前不需要先建立连接,自然就没有TCP中等待连接accept()这个方法,通俗来说,TCP协议就像打电话,要先拨号接通以后二者才能通话,而UDP不用接通就可通话
2.UDP处理和传递消息效率高于TCP,因为UDP是无连接协议,所以资源的消耗相对小一些。
3.UDP在网络状态差强人意的状况下,数据包的丢失现象比较严重,所以具有一定的不可靠性。
以下我们来简单实现UDP的单方通信:
1.先新建立一个Java Project,里面写有关服务器的代码。如下:
以下内容写在主函数中
public static void main(String[] args) throws IOException{
System.out.println("服务器准备好了");
DatagramSocket socket;
try {
//指定端口号
socket = new DatagramSocket(8099);
while(true){
//创建字节数组,规定接收消息的最大长度
byte[] msg=new byte[10];
DatagramPacket request = new DatagramPacket(msg, 10);
//程序很可能会阻塞在这里等待接收消息
socket.receive(request);
String s=new String(msg,"UTF-8");
System.out.println("收到消息: "+s);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2.新建一个Android Application Project,我的叫做UDPClient,里面写客户端部分
建立好工程以后,我们要给我们的客户端加上权限才可以实现与电脑的通信,如图
3.对于客户端来说,我们需要在界面添加一个“发送”按钮和一个消息输入框,并给按钮加上监听
输入框EditText msg最好设成全局变量,3因为后面方便获得输入框中的内容
Button send=(Button)this.findViewById(R.id.button1);
msg=(EditText)this.findViewById(R.id.editText1);
send.setOnClickListener(this);
4.自定义一个发送消息的方法void sendMsg(String message){},其中的参数是需要发送的消息,方法体中创建DatagramSocket对象,获取你所需要连接的电脑的IP,然后将发送的消息装进DatagramPacket中,指定要发送的地址,调用DatagramSocket对象的send()方法
public void sendMsg(String message){
try {
DatagramSocket socket = new DatagramSocket();
//目标地址
InetAddress host = InetAddress.getByName("192.168.31.98");
//指定包要发送的目的地
byte[] data=message.getBytes("UTF-8");//指定UTF-8可以实现中文收发
DatagramPacket request =new DatagramPacket(data,data.length, host, 8099);
//发送
socket.send(request);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
5.在监听中写入线程,在线程中调用发送消息的方法void sendMsg(String message){},这里我突然觉得不是很好。。。因为每点击一次“发送”按钮就会启动一个线程,也就是手机如果给电脑发送N条消息,就会启动N个线程,线程过多会导致资源的浪费而且会降低CPU的利用效率,所以这段代码还有待改进
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
try {
sendMsg(msg.getText().toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
到这里简单的UDP单向通信就完成了,以下是效果图