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)中。

庖丁解牛之仿《闪传》实现文件传输(中)相关推荐

  1. 飞鸽传书文件传输实现原理

    飞鸽传书文件传输实现原理,企业即时通讯软件飞鸽传书,是一款基于TCP/IP协议.基于局域网广播消息模式的通讯软件,适合企业或政府部门局域网内部使用.飞鸽传书用户可在企业内部或外部通过该软件进行工作上的 ...

  2. 文件服务器恢复测试,基于文件传输中文件损坏检测和恢复办法.doc

    基于文件传输中文件损坏检测和恢复办法 基于文件传输中文件损坏检测和恢复办法 摘 要:在网络上文件传输是一种常见的应用,讨论在文件传输完成后检测错误和恢复数据的办法. 关键词:文件传输;文件校验;恢复 ...

  3. 使用ADB Pull文件传输中卡住的解决方法

    使用ADB Pull文件传输中卡住的解决方法 原因分析: 尝试的方法 最终解决方法 优化方法 原因分析: 硬件:PCIE转USB3.0(无供电),PC到手机延长线15M. 使用同一ADB.exe程序在 ...

  4. PERL模拟飞鸽传书文件传输总结

     经过半个月对 FreeEIM 飞鸽传书的学习实践,对于网络SOCKET连接.文件传输的实现原理与具体实现的重点难点已经有了一定的了解. 飞鸽传书唯一官网 文件传输需要建立一个文件发送端,一个文件 ...

  5. java 实现文件秒传_文件传输和秒传

    InetAddress类: InetAddress类是IP地址的封装类,就是把设定的某个ip封装成InetAddress对象,然后使用这个对象能够进行相关的操作.例如获取域名或主机名.上网ip等等.这 ...

  6. 飞鸟快传-集文件传输与文件管理与一体

    永远免费,并且全功能可用,有建议可随时通过以下方式来联系我们 1. App内部的线上反馈或 2. 邮箱:c_show@sina.com 3. 400-6122-968 集文件传输与文件管理与一体,方便 ...

  7. 零拷贝机制在文件传输中的使用手法

    文章目录 文件传输(读取与发送)中的拷贝与上下文切换 零拷贝技术 sendfile sendfile + SG-DMA mmap + write splice Direct I/O 经典应用 文件传输 ...

  8. ajax上传本地音频文件,使用ajax将音频blob上传到文件夹中

    我正在构建一个录音项目,我想通过blob将音频上传到文件夹(上传). 这是我迄今取得的成就: var url = URL.createObjectURL(blob); var li = documen ...

  9. 「效率工具」奶牛快传,文件传输神器

    目前常用的传文件方式存在以下痛点: 微信文件限制 100M 大小 网盘限制上传和下载速度 QQ 几乎没人用了(工作环境) 邮件在移动端接收不方便 奶牛快传很好的解决了以上问题. 工具以网站的形式存在, ...

  10. java tcp 字节_java-TCP文件传输中缺少字节

    我需要能够读取文件,将其分解为任意大小的数据包,比如说512字节,然后通过TCP发送这些数据包.问题是,接收者没有获得即时消息发送的所有字节.如果我发送1000个数据包,则接收器从InputStrea ...

最新文章

  1. 本科-人工智能模拟卷
  2. Abbirb120型工业机器人_工业机器人市场深度调研及投资前景预测报告2020-2024年
  3. retinaface训练笔记
  4. 前端一HTML:七:css初步认识
  5. Tensorflow Day18 Convolutional Autoencoder
  6. thymeleaf常用语法
  7. 【bzoj1022】[SHOI2008]小约翰的游戏John 博弈论
  8. java 相关最新技术_你必须掌握的 21 个 Java 核心技术!
  9. 程序开发中版本管理之命名规则及格式
  10. LVDS 扫盲基础知识
  11. CSDN博客专家申请成功
  12. 【CCPC】2022年绵阳站部分题解(ACGM)
  13. 一位老人告诉我的人生哲理
  14. 服务器ftp文件不能共享文件夹权限,ftp服务器共享文件夹权限设置
  15. excel中精度损失导致太长的数字后面全变成了零的解放方法
  16. 细节决定孩子成长的成败
  17. SourceTree解决冲突的三种情形
  18. 冒泡排序C语言实现 - 源码详解
  19. windows域问题总结--专家门诊四十七问
  20. java将excel转base64_将图片的base64 代码转换为 图片(jpg)

热门文章

  1. 加密软件推荐PGP、TrueCrypt、GPG
  2. 分享66个ASP.NET学校班级源码,总有一款适合您
  3. L 版 -360stack安全大学部署文档
  4. Odoo 16 企业版手册 - 销售管理之销售模版
  5. wpf 软件系统框架
  6. 【秒杀系统】高并发编程入门学习
  7. 知道小编告诉你税务处理流程的方法
  8. 获取Android系统 安全补丁日期 以及系统编译日期
  9. 基于安卓电影院订票系统
  10. 【M2Det】编译Cython版本NMS