Android UDP通信的简单实例和用法归纳,以及与TCP对比、常见问题

来源:互联网 发布:穿t恤不好看 知乎 编辑:程序博客网 时间:2024/05/29 11:39

UDP的数据发送是按照包来发送的。也就是说,你要先把你的数据包装成一个DatagramPacket,然后发送出去。

UDP的开销小,因此用于短连接会非常方便。但缺点就是丢包,(可以辅助以一个TCP协议加以维持丢包重发)。

下面是实例代码,其实无论客户端或服务端都是差不多的,毕竟UDP更偏向于单向发送。

Android客户端:(需要注意的是安卓端需要开启相关的权限,你可以在文末附上的那篇文章里找到相关的解决方法)

import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.Socket;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        et=(EditText)findViewById(R.id.et);        bt=(Button)findViewById(R.id.btn);        bt2=(Button)findViewById(R.id.btn2);        System.out.println("启动");        bt.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                new Thread(sendMyMessage).start();//新线程,防止堵塞主线程            }        });        bt2.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                try{                    socket.close();                    finish();                }                catch (Exception e){                    e.printStackTrace();                }                finally {                    finish();                }            }        });    }    private DatagramSocket socket;    private DatagramPacket packet;    private final String IP="192.168.1.103";    private final int ServerPORT=12345;    private final int ClientPORT=1234;    private EditText et;    private Button bt;    private Button bt2;    Runnable sendMyMessage=new Runnable() {        @Override        public void run() {            try{                socket = new DatagramSocket(ClientPORT);//本地发送窗口                //InetAddress serverIP=InetAddress.getByName(IP);                byte[] buf = "yes.".getBytes();//将你的数据转化为byte                packet = new DatagramPacket(buf,buf.length,InetAddress.getByName(IP),ServerPORT);//数据打包,服务器地址和接收窗口                socket.send(packet);/发送消息                /*接受服务器回传消息                packet = new DatagramPacket(buf,buf.length);                socket.receive(packet);*/                socket.close();//发送完就可以关闭了,防止端口占用            }catch (Exception e){                e.printStackTrace();            }        }    };}

PC上的服务器:

import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;public class UDPTarget { public static void main(String[] args){ DatagramSocket socket; DatagramPacket packet; byte[] buf = new byte[1024];            try {    socket = new DatagramSocket(12345);//注意这个12345是ServerPORT,也就是服务器监听的端口packet = new DatagramPacket(buf, buf.length);while(true){socket.receive(packet);//接受数据包System.out.println(packet.getAddress().getHostAddress()+":"+packet.getPort());//获取客户端的IP和端口System.out.println(new String(packet.getData(), 0, packet.getLength()));}//socket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} }}
测试结果如下:




我们可以总结这个步骤流程:

1.创建一个DatagramSocket实例:

DatagramSocket socket=new DatagramSocket();
作为发送方,如果只是单纯的发送,你完全可以不指定这个Socket的监听端口,因为你根本不打算收到回传消息。

作为接收方,你必须指定这个监听的端口。

2.1发送步骤

打包数据并发送,需要知道接收方的IP和它所监听的端口:

byte[] buf = "yes.".getBytes();//这是数据packet = new DatagramPacket(buf,buf.length,InetAddress.getByName(IP),ServerPORT);//数据打包,并发往服务器地址和接收窗口socket.send(packet);//发送
2.2接收步骤

socket = new DatagramSocket(ServerPORT);//监听端口packet = new DatagramPacket(buf, buf.length);socket.receive(packet);//接收System.out.println(new String(packet.getData(), 0, packet.getLength()));//拆包

3.关闭Socket

socket.close();



相比起TCP,UDP实现起来逻辑更简单(收发方逻辑几乎是相同的),开销也更小,在一般通讯时,主要利用UDP来发送消息是个不错的选择;不过我们还需要一点辅助手段来处理UDP丢包的问题。


可以到这里查看关于TCP的实现,并进行对比:

常见问题等也见下面这篇文章的最后一段:

>Android TCP通信的简单实例以及常见问题[超时/主线程阻塞]<



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子花钱玩游戏怎么办 mykung充不了电怎么办 脑出血恢复期身体软怎么办 腿里面有积水怎么办 手臂伤筋了怎么办 想打羽毛球没人怎么办 对看书没有兴趣怎么办 痴呆老人晚上闹怎么办 高中毕业证没拿怎么办 高考志愿同分怎么办 儿童吃虾过敏怎么办 滑板湿水了怎么办 老员工不听指挥怎么办 手机显示连接itunes怎么办 苹果手机下载不信任怎么办 暗影格斗3进不去怎么办 喝酒第二天头痛怎么办 加油忘记拔枪怎么办 刷机完成后怎么办 苹果8按键音太小怎么办 电脑蓝屏出英文怎么办 win10蓝屏重启怎么办 苹果手机变蓝屏怎么办 nga账号声望不足怎么办 鬃狮蜥胆小咬人怎么办 小狗拉稀脱水了怎么办 泰迪刚到家老叫怎么办 开车遇到拉死人怎么办 斯诺克解不到球怎么办 颈椎和腰椎不好怎么办 车祸肇事者不赔偿怎么办 交强险自赔吃亏怎么办 交通事故保险不结案怎么办 马蚁借呗超出一天还款怎么办 千里追风油太辣怎么办 蛀牙牙肉肿痛怎么办 转转删除的东西怎么办 专票开给了个人怎么办 手机用户密码忘了怎么办 手机用户密码忘记了怎么办 悦借钱账户锁定怎么办