庖丁解牛之仿《闪传》实现文件传输(中)
1.> 转载请标明出处
本文出自[HCY的微博]
一、概述
在上篇庖丁解牛之仿《闪传》实现文件传输(上)通过WIFI API实现了两台手机所在网络的建立,那么如何让它们建立TCP连接呢?如何知道作为服务端一方的IP地址和端口号呢?方法是通过UDP多点广播(多播)服务端的Ip地址和端口号,客户端接收到这多播信息之后,连接上服务端。
二、UDP多播消息发送者
ipv4中的多播地址范围是:224.0.0.0到239.255.255.255
/*** UDP广播发送者*/
class MulticastSender extends BaseThread {private MulticastSocket multicastSocket;private String multicastHost;private int port;public MulticastSender(String host, int port) throws IOException,IllegalArgumentException {if (TextUtils.isEmpty(host)) {throw new IllegalArgumentException("host should not be null");}this.multicastHost = host;this.port = port;multicastSocket = new MulticastSocket();// 添加多播地址InetAddress groupAddr = InetAddress.getByName(host);multicastSocket.joinGroup(groupAddr);}/*** 发送多播消息内部实现* * @param message* @throws IOException*/private void sendMessageInternal(byte[] message) throws IOException {if (message == null) {LogUtils.i("MulticastSender,message is null");return;}DatagramPacket datagramPacket = new DatagramPacket(message,message.length);InetAddress groupAddr = InetAddress.getByName(multicastHost);datagramPacket.setAddress(groupAddr);// 目标接收地址需要与多播地址相同datagramPacket.setPort(port); // 目标端口号multicastSocket.send(datagramPacket);}/*** 发送多播消息* * @param message*/public void sendMessage(byte[] message) {MulticastMessagePool.getInstance().addMessage(message);}@Overridepublic void run() {while (!isExit) {byte[] message = MulticastMessagePool.getInstance().getMessage();if (message != null) {try {sendMessageInternal(message);} catch (Exception e) {e.printStackTrace();}}}multicastSocket.close();}}
如上代码实现了一个多播消息发送者,发送者每次从消息池中获取到消息后将其发送出去,如果没有消息,则发送线程等待消息的到来。
三、UDP多播消息接收者
class MulticastReceiver extends BaseThread {private MulticastSocket multicastSocket;private String host;private int port;private int recvBufSize = 1024;// 接收数据缓冲区大小private OnUdpMulticastReceiveListener udpMulticastReceiveListener;public MulticastReceiver(String host, int port, int recvBufSize)throws IOException, IllegalArgumentException {if (TextUtils.isEmpty(host)) {throw new IllegalArgumentException("host should not be null");}this.host = host;this.port = port;this.recvBufSize = recvBufSize;multicastSocket = new MulticastSocket(port);InetAddress groupAddr = InetAddress.getByName(host);multicastSocket.joinGroup(groupAddr);}@Overridepublic void run() {try {byte buf[] = new byte[recvBufSize];DatagramPacket datagramPacket = null;datagramPacket = new DatagramPacket(buf, buf.length,InetAddress.getByName(host), port);while (!isExit) {multicastSocket.receive(datagramPacket);int len = datagramPacket.getLength();byte[] receivedData = new byte[len];System.arraycopy(buf, 0, receivedData, 0, len);onRecieveMessage(receivedData);}} catch (Exception e) {e.printStackTrace();} finally {multicastSocket.close();}}/*** 设置广播接收监听器* * @param l*/public void setOnUdpMulticastReceiveListener(OnUdpMulticastReceiveListener l) {this.udpMulticastReceiveListener = l;}private void onRecieveMessage(byte[] message) {if (udpMulticastReceiveListener != null) {udpMulticastReceiveListener.onReceive(message);}}}
上述代码都在TcpUdpLibrary(https://github.com/Money888/TcpUdpLibrary)中。
庖丁解牛之仿《闪传》实现文件传输(中)相关推荐
- 飞鸽传书文件传输实现原理
飞鸽传书文件传输实现原理,企业即时通讯软件飞鸽传书,是一款基于TCP/IP协议.基于局域网广播消息模式的通讯软件,适合企业或政府部门局域网内部使用.飞鸽传书用户可在企业内部或外部通过该软件进行工作上的 ...
- 文件服务器恢复测试,基于文件传输中文件损坏检测和恢复办法.doc
基于文件传输中文件损坏检测和恢复办法 基于文件传输中文件损坏检测和恢复办法 摘 要:在网络上文件传输是一种常见的应用,讨论在文件传输完成后检测错误和恢复数据的办法. 关键词:文件传输;文件校验;恢复 ...
- 使用ADB Pull文件传输中卡住的解决方法
使用ADB Pull文件传输中卡住的解决方法 原因分析: 尝试的方法 最终解决方法 优化方法 原因分析: 硬件:PCIE转USB3.0(无供电),PC到手机延长线15M. 使用同一ADB.exe程序在 ...
- PERL模拟飞鸽传书文件传输总结
经过半个月对 FreeEIM 飞鸽传书的学习实践,对于网络SOCKET连接.文件传输的实现原理与具体实现的重点难点已经有了一定的了解. 飞鸽传书唯一官网 文件传输需要建立一个文件发送端,一个文件 ...
- java 实现文件秒传_文件传输和秒传
InetAddress类: InetAddress类是IP地址的封装类,就是把设定的某个ip封装成InetAddress对象,然后使用这个对象能够进行相关的操作.例如获取域名或主机名.上网ip等等.这 ...
- 飞鸟快传-集文件传输与文件管理与一体
永远免费,并且全功能可用,有建议可随时通过以下方式来联系我们 1. App内部的线上反馈或 2. 邮箱:c_show@sina.com 3. 400-6122-968 集文件传输与文件管理与一体,方便 ...
- 零拷贝机制在文件传输中的使用手法
文章目录 文件传输(读取与发送)中的拷贝与上下文切换 零拷贝技术 sendfile sendfile + SG-DMA mmap + write splice Direct I/O 经典应用 文件传输 ...
- ajax上传本地音频文件,使用ajax将音频blob上传到文件夹中
我正在构建一个录音项目,我想通过blob将音频上传到文件夹(上传). 这是我迄今取得的成就: var url = URL.createObjectURL(blob); var li = documen ...
- 「效率工具」奶牛快传,文件传输神器
目前常用的传文件方式存在以下痛点: 微信文件限制 100M 大小 网盘限制上传和下载速度 QQ 几乎没人用了(工作环境) 邮件在移动端接收不方便 奶牛快传很好的解决了以上问题. 工具以网站的形式存在, ...
- java tcp 字节_java-TCP文件传输中缺少字节
我需要能够读取文件,将其分解为任意大小的数据包,比如说512字节,然后通过TCP发送这些数据包.问题是,接收者没有获得即时消息发送的所有字节.如果我发送1000个数据包,则接收器从InputStrea ...
最新文章
- 本科-人工智能模拟卷
- Abbirb120型工业机器人_工业机器人市场深度调研及投资前景预测报告2020-2024年
- retinaface训练笔记
- 前端一HTML:七:css初步认识
- Tensorflow Day18 Convolutional Autoencoder
- thymeleaf常用语法
- 【bzoj1022】[SHOI2008]小约翰的游戏John 博弈论
- java 相关最新技术_你必须掌握的 21 个 Java 核心技术!
- 程序开发中版本管理之命名规则及格式
- LVDS 扫盲基础知识
- CSDN博客专家申请成功
- 【CCPC】2022年绵阳站部分题解(ACGM)
- 一位老人告诉我的人生哲理
- 服务器ftp文件不能共享文件夹权限,ftp服务器共享文件夹权限设置
- excel中精度损失导致太长的数字后面全变成了零的解放方法
- 细节决定孩子成长的成败
- SourceTree解决冲突的三种情形
- 冒泡排序C语言实现 - 源码详解
- windows域问题总结--专家门诊四十七问
- java将excel转base64_将图片的base64 代码转换为 图片(jpg)