QQ20160628-0.png (37.44 KB, 下载次数: 3563)
下载附件 保存到相册
8 年前 上传
2.png (256.65 KB, 下载次数: 3556)
3.png (122.11 KB, 下载次数: 3503)
/* * Copyright (C) 2016 即时通讯网(52im.net) - 即时通讯开发者社区. * All rights reserved. */ package net.x52im.example.android.udp; import net.x52im.example.android.udp.utils.UDPUtils; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.ActionBarActivity; import android.util.Log; /** * Demo主类。 * * @author jack.jiang@52im.net, 2016-06-27 * @version 1.0 */ public class MainActivity extends ActionBarActivity { private final static String TAG = MainActivity.class.getSimpleName(); // 重复发送的时间间隔(单位:毫秒) public static int INTERVAL = 5000; private Handler handler = null; private Runnable runnable = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化本地UDP的Socket LocalUDPSocketProvider.getInstance().initSocket(); // 启动本地UDP监听(接收数据用的) LocalUDPDataReciever.getInstance(this).startup(); // 自动循环发送 handler = new Handler(); runnable = new Runnable(){ @Override public void run() { sendMessageToServer(); // 开始下一次循环 handler.postDelayed(runnable, INTERVAL); } }; // 立即开始发送 handler.postDelayed(runnable, 0); } private void sendMessageToServer() { try { // 要发送的数据 String toServer = "Hi,我是客户端,我的时间戳"+System.currentTimeMillis(); byte[] soServerBytes = toServer.getBytes("UTF-8"); // 开始发送 boolean ok = UDPUtils.send(soServerBytes, soServerBytes.length); if(ok) Log.d(TAG, "发往服务端的信息已送出."); else Log.e(TAG, "发往服务端的信息没有成功发出!!!"); } catch (Exception e) { Log.w(TAG, e.getMessage(), e); } } }
/* * Copyright (C) 2016 即时通讯网(52im.net) - 即时通讯开发者社区. * All rights reserved. */ package net.x52im.example.android.udp; import java.net.DatagramSocket; import java.net.InetAddress; import net.x52im.example.android.udp.utils.ConfigEntity; import android.util.Log; /** * 本地 UDP Socket 管理类。 * * @author jack.jiang@52im.net, 2016-06-27 * @version 1.0 */ public class LocalUDPSocketProvider { private static final String TAG = LocalUDPSocketProvider.class.getSimpleName(); private static LocalUDPSocketProvider instance = null; private DatagramSocket localUDPSocket = null; public static LocalUDPSocketProvider getInstance() { if (instance == null) instance = new LocalUDPSocketProvider(); return instance; } public void initSocket() { try { // UDP本地监听端口(如果为0将表示由系统分配,否则使用指定端口) this.localUDPSocket = new DatagramSocket(ConfigEntity.localUDPPort); // 调用connect之后,每次send时DatagramPacket就不需要设计目标主机的ip和port了 // * 注意:connect方法一定要在DatagramSocket.receive()方法之前调用, // * 不然整send数据将会被错误地阻塞。这或许是官方API的bug,也或许是调 // * 用规范就应该这样,但没有找到官方明确的说明 this.localUDPSocket.connect( InetAddress.getByName(ConfigEntity.serverIP), ConfigEntity.serverUDPPort); this.localUDPSocket.setReuseAddress(true); Log.d(TAG, "new DatagramSocket()已成功完成."); } catch (Exception e) { Log.w(TAG, "localUDPSocket创建时出错,原因是:" + e.getMessage(), e); } } public DatagramSocket getLocalUDPSocket() { return this.localUDPSocket; } }
/* * Copyright (C) 2016 即时通讯网(52im.net) - 即时通讯开发者社区. * All rights reserved. */ package net.x52im.example.android.udp; import java.net.DatagramPacket; import java.net.DatagramSocket; import net.x52im.example.android.udp.utils.ConfigEntity; import android.content.Context; import android.util.Log; /** * 本地UDP端口监听和数据接收类。 * * @author jack.jiang@52im.net, 2016-06-27 * @version 1.0 */ public class LocalUDPDataReciever { private static final String TAG = LocalUDPDataReciever.class.getSimpleName(); private static LocalUDPDataReciever instance = null; private Thread thread = null; private Context context = null; public static LocalUDPDataReciever getInstance(Context context) { if (instance == null) instance = new LocalUDPDataReciever(context); return instance; } private LocalUDPDataReciever(Context context) { this.context = context; } public void startup() { this.thread = new Thread(new Runnable() { public void run() { try { Log.d(LocalUDPDataReciever.TAG, "本地UDP端口侦听中,端口=" + ConfigEntity.localUDPPort + "..."); //开始侦听 LocalUDPDataReciever.this.udpListeningImpl(); } catch (Exception eee) { Log.w(LocalUDPDataReciever.TAG, "本地UDP监听停止了(socket被关闭了?)," + eee.getMessage(), eee); } } }); this.thread.start(); } private void udpListeningImpl() throws Exception { while (true) { byte[] data = new byte[1024]; // 接收数据报的包 DatagramPacket packet = new DatagramPacket(data, data.length); DatagramSocket localUDPSocket = LocalUDPSocketProvider.getInstance().getLocalUDPSocket(); if ((localUDPSocket == null) || (localUDPSocket.isClosed())) continue; // 阻塞直到收到数据 localUDPSocket.receive(packet); // 解析服务端发过来的数据 String pFromServer = new String(packet.getData(), 0 , packet.getLength(), "UTF-8"); Log.w(LocalUDPDataReciever.TAG, "【NOTE】>>>>>> 收到服务端的消息:"+pFromServer); } } }
QQ20160627-0.png (410.25 KB, 下载次数: 3596)
5.png (185.5 KB, 下载次数: 3535)
6.png (113.71 KB, 下载次数: 3492)
来源:即时通讯网 - 即时通讯开发者社区!
轻量级开源移动端即时通讯框架。
快速入门 / 性能 / 指南 / 提问
轻量级Web端即时通讯框架。
详细介绍 / 精编源码 / 手册教程
移动端实时音视频框架。
详细介绍 / 性能测试 / 安装体验
基于MobileIMSDK的移动IM系统。
详细介绍 / 产品截图 / 安装体验
一套产品级Web端IM系统。
详细介绍 / 产品截图 / 演示视频
引用此评论
引用:279150469 发表于 2016-07-06 17:47 mark,写得非常好,易懂
引用:ken111 发表于 2018-03-17 19:09 楼主好,请问android的客户端程序是否可以使用nio的DatagramChannel进行发送和接收数据?@JackJiang
精华主题数超过100个。
连续任职达2年以上的合格正式版主
为论区做出突出贡献的开发者、版主等。
本人属:兔
经核实认证的即时通讯技术开发者、技术博主、开源工程作者、原创精华文章作者等。
积极发起、参与各类话题的讨论等,主题、发帖内容较有价值。
本人属:猪
Copyright © 2014-2024 即时通讯网 - 即时通讯开发者社区 / 版本 V4.4
苏州网际时代信息科技有限公司 (苏ICP备16005070号-1)
Processed in 0.637719 second(s), 48 queries , Gzip On.