android基于UDP实现聊天小功能

news2024/11/23 11:42:35

一、DatagramSocket

DatagramSocket 是 Java 中用于发送和接收 UDP 数据包的类。它提供了创建和管理 UDP 套接字的功能。以下是 DatagramSocket 类的一些常用方法:

  • DatagramSocket(): 创建一个未绑定到特定本地地址和端口的 DatagramSocket 实例。

  • DatagramSocket(int port): 创建一个绑定到指定本地端口的 DatagramSocket 实例。

  • void send(DatagramPacket packet): 发送一个数据包到目标地址。

  • void receive(DatagramPacket packet): 接收一个数据包。

  • void bind(SocketAddress address): 将套接字绑定到指定的本地地址。

  • void close(): 关闭套接字。

二、DatagramPacket

DatagramPacket 是 Java 中用于表示 UDP 数据包的类。它包含了数据包的内容、目标地址和端口等相关信息。以下是 DatagramPacket 类的一些常用方法:

  • DatagramPacket(byte[] data, int length): 创建一个接收数据包的实例,使用指定的字节数组和数据长度。

  • DatagramPacket(byte[] data, int length, InetAddress address, int port): 创建一个发送数据包的实例,使用指定的字节数组、数据长度、目标地址和目标端口。

  • byte[] getData(): 获取接收到的数据包的字节数组。

  • void setData(byte[] data): 设置要发送的数据包的字节数组。

  • int getLength(): 获取数据包的长度。

  • void setLength(int length): 设置数据包的长度。

  • InetAddress getAddress(): 获取数据包的目标地址。

  • void setAddress(InetAddress address): 设置数据包的目标地址。

  • int getPort(): 获取数据包的目标端口。

  • void setPort(int port): 设置数据包的目标端口。

三、核心代码

3.1、接收UDP数据线程MyReceiveThread

private class MyReceiveThread implements Runnable {
        @Override
        public void run() {
            //要循环接收数据
            while (true) {
                try {
                    Log.d(TAG, "udp waiting....");
                    receivedSocket.receive(packet);
                    //获取数据的时候,要使用带有offset的
                    String msg = new String(packet.getData(), 0, packet.getLength(), "UTF-8");
                    Log.e(TAG, "Received msg:" + msg);
                    targetIp = packet.getAddress().getHostAddress();
                    MessageEntity messageEntity = new MessageEntity();
                    messageEntity.setRole(MessageEntity.ROLE_CLIENT);
                    messageEntity.setMessage(msg);
                    mEntities.add(messageEntity);
                    etTargetIp.post(() -> mMessageAdapter.notifyDataSetChanged());
                } catch (SocketException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    receivedSocket.close();
                }
            }
        }
    }
  • 接收数据的时候,要开启一个循环
  • 获取数据的时候,要使用String(byte bytes[], int offset, int length, String charsetName)

3.2、发送数据

public void sendMsg(View view) {
        targetIp = etTargetIp.getText().toString();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    DatagramSocket socket = new DatagramSocket();
                    String message = msg.getText().toString();
                    byte[] msgs = message.getBytes("UTF-8");
                    InetAddress address = InetAddress.getByName(targetIp);
                    DatagramPacket packet = new DatagramPacket(msgs, msgs.length);
                    packet.setAddress(address);
                    packet.setPort(PORT);
                    socket.send(packet);
                    MessageEntity messageEntity = new MessageEntity();
                    messageEntity.setRole(MessageEntity.ROLE_HOST);
                    messageEntity.setMessage(message);
                    mEntities.add(messageEntity);
                    etTargetIp.post(() -> mMessageAdapter.notifyDataSetChanged());
                } catch (SocketException e) {
                    e.printStackTrace();
                    Log.e(TAG, e.getMessage());
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                    Log.e(TAG, e.getMessage());
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.e(TAG, e.getMessage());
                }
            }
        }).start();
    }

Github

四、使用tcpdump抓包

4.1、tcpdump官网下载

在这里插入图片描述

4.2、adb push

adb push D:\tcpdump /data/

4.3、给tcpdump执行权限

adb shell
cd data
chmod +x tcpdump

4.3、查看设备的网口

./tcpdump -D 

在这里插入图片描述

4.4、抓取wlan0的数据包

./tcpdump -i wlan0 -w 2.pcap

在这里插入图片描述
在这里插入图片描述

4.5、导出抓包数据

adb pull /data/2.pcap D:\

4.6、使用wireshark打开2.pcap文件

在这里插入图片描述

五、网络协议

在这里插入图片描述

上面是一条完整的UDP数据包

5.1、以太网(Ethernet)

在这里插入图片描述

以太网(Ethernet)是一种常用的有线局域网(LAN)技术,用于在计算机和其他网络设备之间进行数据通信。它定义了物理层和数据链路层的规范,用于在局域网中传输数据帧。

以太网使用数据链路层协议来组织和管理数据的传输。最常见的以太网数据链路层协议是**以太网帧(Ethernet Frame)**格式,它定义了数据帧的结构和字段。以太网帧包括源和目标MAC地址、帧类型、数据、校验和等字段。

5.1.1、以太网首部结构

在这里插入图片描述

  • 以太网首部的长度为14个字节
  • 以太网首部的字段包括:
    • 目标MAC地址(Destination MAC Address)6个字节:指示帧的目标设备的MAC地址,用于将帧发送到正确的目标设备。
      在这里插入图片描述

    • 源MAC地址(Source MAC Address)6个字节:指示帧的发送方设备的MAC地址,用于标识帧的来源。
      在这里插入图片描述

    • 以太网类型(Ethernet Type)或长度(Length)2个字节:指示帧中包含的上层协议类型或数据部分长度。以太网类型字段通常用于标识上层协议,如IPv4(值为0x0800)IPv6(值为0x86DD)ARP(值为0x0806) 等。长度字段在某些情况下用于指示数据部分的长度。
      在这里插入图片描述

5.2、IP协议

在这里插入图片描述
IP(Internet Protocol)协议是互联网中最核心的网络协议之一,它负责在网络中传输数据包。IP协议定义了数据包的格式、路由选择和分组交换等机制,使得数据能够在不同的网络之间进行传输和路由。

以下是IP协议的主要特点和功能:
1、 无连接性:IP协议是一种无连接的协议,每个IP数据包都是独立传输的。在发送数据时,每个数据包被独立处理,并根据目标地址进行路由选择。这种无连接性使得IP协议的传输效率较高,但也意味着它不提供可靠性保证,不保证数据包的顺序和可靠传输。

2、数据包格式:IP协议定义了数据包的格式,通常称为IP数据报(IP Datagram)。IP数据报由首部(Header)和有效载荷(Payload)组成。IP首部包含了源IP地址、目标IP地址、协议版本、首部长度、服务类型、数据包长度、标识、生存时间(TTL)、校验和等字段,用于控制和识别数据包。有效载荷部分包含上层协议的数据。

3、IP地址:IP协议使用IP地址来标识网络中的设备。IP地址是一个32位(IPv4)或128位(IPv6)的数字标识符。IPv4地址由四个8位的数字组成,每个数字用点分隔。IPv6地址通常使用八组四位的十六进制数表示。IP地址用于寻址和路由选择,确保数据包能够正确到达目标设备。

4、路由选择:IP协议使用路由选择算法将数据包从源主机传输到目标主机。路由选择根据目标IP地址和路由表中的路由信息进行决策,确定下一跳的路径。路由选择算法的目标是找到最佳路径,使数据包能够以最高效的方式到达目标设备。

5、分组交换:IP协议采用分组交换的方式传输数据包。数据包在发送端被分成较小的数据块(分组),每个分组独立传输。在网络中,每个分组根据目标地址进行独立的路由选择和转发,最终在目标设备上重新组装成完整的数据包。这种分组交换的方式提高了网络的利用率和灵活性。

6、差错检测:IP协议使用校验和字段对数据包进行差错检测。发送端在发送数据包时计算校验和,并将其包含在IP首部中。接收端在接收到数据包后,重新计算校验和,并与接收到的校验和进行比较,以检测数据包是否在传输过程中发生了错误。

5.2.1、IP数据报首部

在这里插入图片描述
在这里插入图片描述
IPv4首部字段(20字节)

  • 版本(Version):占4位,指定IP协议的版本号,IPv4为4。

  • 在这里插入图片描述

  • 首部长度(Header Length):占4位,指定IP首部的长度,以4字节为单位。由于IPv4首部长度最多为15个4字节(60字节),因此它实际上是首部中32位字的数量。
    在这里插入图片描述
    在这里插入图片描述
    16进制45的二进制为0100 0101,其中前4位代表IP协议的version,后4位代表IP协议首部长度

  • 服务类型(Type of Service):占8位,用于指定数据包的服务质量要求,如优先级、延迟和吞吐量等。
    在这里插入图片描述

  • 总长度(Total Length):占16位,指定整个IP数据包的长度,包括首部和数据部分。
    在这里插入图片描述

  • 标识(Identification):占16位,用于标识数据包的唯一性,通常由发送端设置,并在接收端进行处理。
    在这里插入图片描述

  • 标志(Flags):占3位,用于指示数据包的特殊处理标志。其中包括禁止分片标志(DF)和更多分片标志(MF)。
    在这里插入图片描述

  • 片偏移(Fragment Offset):占13位,用于指定数据包片段在原始数据包中的位置。
    在这里插入图片描述

  • 生存时间(Time to Live,TTL):占8位,表示数据包在网络中可以经过的最大路由跳数。每经过一个路由器,该字段的值减1,当值为0时,数据包将被丢弃。
    在这里插入图片描述

  • 协议(Protocol):占8位,指定上层协议类型,如TCP、UDP或ICMP。
    在这里插入图片描述

  • 首部校验和(Header Checksum):占16位,用于校验IP首部的完整性。
    在这里插入图片描述

  • 源IP地址(Source IP Address):占32位,指定数据包的源IP地址。
    在这里插入图片描述

  • 目标IP地址(Destination IP Address):占32位,指定数据包的目标IP地址。
    在这里插入图片描述

5.3、UDP协议

在这里插入图片描述
UDP(User Datagram Protocol)是一种面向无连接传输层协议。与TCP(Transmission Control Protocol)相比,UDP更加轻量级,没有建立和维护连接的开销,因此传输效率更高,但也不提供可靠性保证。

以下是UDP的主要特点和用途:

  • 无连接性:UDP是一种无连接的协议,不需要在发送数据之前建立连接。每个UDP数据包都是独立发送的,不会进行握手和确认。这使得UDP的传输速度较快,适用于实时性要求较高的应用。

  • 简单性与轻量性:相比TCP,UDP的协议头部较小,仅包含源端口、目标端口、长度和校验和等简单字段。这使得UDP的开销较小,传输效率较高。

  • 不可靠性:UDP不提供数据包的可靠性保证。它不保证数据包的顺序和可靠传输,也不进行重传和拥塞控制。因此,如果使用UDP进行数据传输,必须由应用层自行处理数据的完整性和可靠性。

  • 广播和多播支持:UDP支持广播和多播传输。通过UDP广播,可以将数据包发送到同一网络中的所有主机。而通过UDP多播,可以将数据包发送到特定的多播组。

  • 实时性要求:由于UDP的无连接性和较低的开销,它在实时性要求较高的应用中得到广泛应用。例如,音频和视频流传输、实时游戏和语音通信等。

  • 域名解析:UDP常用于域名解析中的DNS(Domain Name System)服务。DNS使用UDP协议在域名服务器和客户端之间进行域名解析查询和响应。

5.3.1、UDP首部

在这里插入图片描述
UDP(User Datagram Protocol)的首部(Header)是UDP数据报中用于控制和识别的固定长度字段集合。UDP首部包含以下字段:

  • 源端口号(Source Port):占16位,指定发送方的端口号。
    在这里插入图片描述

  • 目标端口号(Destination Port):占16位,指定接收方的端口号。
    在这里插入图片描述

  • 长度(Length):占16位,指定UDP数据报的总长度(包括首部和数据部分)。
    在这里插入图片描述

  • 校验和(Checksum):占16位,用于校验UDP数据报的完整性。
    在这里插入图片描述

5.4、ARP协议

ARP(Address Resolution Protocol)是一种用于将IP地址映射到物理MAC地址的协议。它在TCP/IP网络中起着重要的作用,用于解决主机在发送数据时,如何根据目标IP地址找到对应的物理MAC地址的问题。

以下是ARP协议的基本工作原理:

  • ARP请求:当主机需要向目标IP地址发送数据时,首先检查本地的ARP缓存(ARP Cache)中是否存在目标IP地址对应的MAC地址。如果缓存中没有对应的映射关系,主机会发送一个ARP请求广播到本地网络中的所有主机。

  • ARP应答:接收到ARP请求的主机,如果发现自己的IP地址与请求中的目标IP地址匹配,就会发送一个ARP应答给请求方,包含自己的MAC地址。

  • ARP缓存更新:请求方收到ARP应答后,会将目标IP地址与对应的MAC地址的映射关系存储在本地的ARP缓存中,以便将来使用。这样,当再次需要向目标IP地址发送数据时,就可以直接从ARP缓存中获取目标的MAC地址。

ARP协议使用的是广播的方式,因此ARP请求和应答都会发送到本地网络中的所有主机。只有与请求IP地址匹配的主机才会应答,其他主机会忽略。

ARP协议的作用是解决逻辑地址(IP地址)到物理地址(MAC地址)的映射问题,使数据能够正确地在网络中传输。它在局域网中起着重要的作用,帮助主机建立和维护IP地址与MAC地址之间的映射关系。

5.4.1、ARP协议的首部

在这里插入图片描述
ARP(Address Resolution Protocol)协议的首部(Header)包含以下字段:

  • 硬件类型(Hardware Type):占2个字节,指定网络硬件类型,如以太网、无线局域网等。常见的以太网类型为1。
    在这里插入图片描述

  • 协议类型(Protocol Type):占2个字节,指定网络层协议类型,通常为IPv4或IPv6。IPv4的协议类型为0x0800。
    在这里插入图片描述

  • 硬件地址长度(Hardware Address Length):占1个字节,指定硬件地址的长度,通常为6个字节(以太网MAC地址长度)。
    在这里插入图片描述

  • 协议地址长度(Protocol Address Length):占1个字节,指定协议地址的长度,通常为4个字节(IPv4地址长度)。
    在这里插入图片描述

  • 操作码(Operation Code):占2个字节,指定ARP消息的类型。常见的操作码包括请求(1)和应答(2)。
    请求操作码
    应答操作码

  • 发送方硬件地址(Sender Hardware Address):占长度与硬件地址长度字段指定的长度相同,指定发送方的硬件地址,即发送方的MAC地址。
    在这里插入图片描述

  • 发送方协议地址(Sender Protocol Address):占长度与协议地址长度字段指定的长度相同,指定发送方的协议地址,即发送方的IP地址。
    在这里插入图片描述

  • 目标硬件地址(Target Hardware Address):占长度与硬件地址长度字段指定的长度相同,指定目标的硬件地址,即目标的MAC地址。
    在这里插入图片描述
    因为目前还不知道对方的Mac地址,所以此时为0

  • 目标协议地址(Target Protocol Address):占长度与协议地址长度字段指定的长度相同,指定目标的协议地址,即目标的IP地址。
    在这里插入图片描述

ARP协议首部的长度固定为28个字节(224位)

使用ARP协议,主机可以通过发送ARP请求来查询目标IP地址对应的MAC地址。接收到ARP请求的主机会发送ARP应答,将自己的MAC地址告知请求方。这样,发送方就能够获得目标IP地址与对应的MAC地址的映射关系,并在数据传输时使用正确的MAC地址。

需要注意的是,ARP协议在广播域内工作,即只适用于同一局域网内的主机之间。在跨网段通信时,会使用其他协议(如ARP的扩展协议Proxy ARP、ARP的替代协议NDP等)来解决IP地址到MAC地址的映射问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1258982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

普乐蛙绵阳科博会一场VR科普航天科学盛宴科普知识

普乐蛙绵阳科普展:一场科学盛宴,点燃孩子探索欲望的火花! 普乐蛙绵阳科普展正在如火如荼地进行中,吸引了无数孩子和家长的热情参与。这场科普盛宴以独特的内外视角,让人们感受到科学的魅力,激发了孩子们对知识的渴望和…

蚁剑低版本反制

蚁剑低版本反制 漏洞概述 中国蚁剑是一款开源的跨平台网站管理工具&#xff0c;它主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员。影响范围 AntSword <2.0.7 蚁剑实验版本&#xff1a;2.0.7 环境搭建&#xff1a; 172.16.1.233&#xff08;蓝队服…

如何在 Photoshop 中制作金像

如何使用渐变贴图和一些鲜为人知的 Photoshop 图像效果在 Photoshop 中制作金像 1. 如何为图像添加噪点 步骤 1 首先&#xff0c;将“颜色填充”图层设置为淡蓝色 #a9c9dd 颜色。 步骤 2 接下来&#xff0c;让我们右键单击>创建智能对象&#xff0c;以防万一我们以后想要…

【EasyExcel】导出excel并支持自定义设置数据行背景颜色等

需求背景&#xff1a; 根据查询条件将列表数据导出&#xff0c;并筛选出满足某个条件的数据&#xff0c;将满足条件的数据的背景颜色设置成黄色。 &#xff08;本文例子如&#xff1a;name出现的次数大于等于2&#xff0c;将相关数据背景颜色都设置为黄色&#xff09; …

代码签名证书是如何保护软件?

随着互联网的普及和技术的发展&#xff0c;软件开发已经成为了一个非常重要的行业。然而&#xff0c;软件安全问题也日益凸显&#xff0c;恶意软件、病毒、木马等威胁着用户的数据安全和隐私。为了确保软件的安全和可靠性&#xff0c;开发者需要采取一系列措施来保护他们的产品…

在线教育行业内卷突围,持续激活平台用户体验是关键

在线教育并不等同于K12教育。 众所周知&#xff0c;越来越卷的考试制度&#xff0c;已经被家长、学生们的谩骂和吐槽淹没了好几层。各种减负、杜绝课后补课等条例纷纷出台&#xff0c;不断的挤压着K12教育企业的生存空间。 于是乎&#xff0c;大家都认为&#xff0c;在线教育…

笔记62:注意力汇聚 --- Nadaraya_Watson 核回归

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章&#xff1a;动手学深度学习~注意力机制 a a a a a a a a a a a a a a a a

一键换肤功能

使用css3的css变量来实现 示例&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&qu…

好用的IDEA插件推荐

前言 Idea 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序,Idea 还具有许多插件和扩展&#xff0c;可以根据开发人员的需要进行定制和扩展&#xff0c;从而提高开发效率,今天我们就来介绍一款…

使用opencv的matchTemplate进行银行卡卡号识别

![字体文件](https://img-blog.csdnimg.cn/3a16c87cf4d34aceb0778c4b20ddadb2.png#pic_center import cv2 import numpy as npdef show_img(img, name"temp"):img cv2.resize(img, (0, 0), fx3, fy3)cv2.imshow(name, img)cv2.waitKey(0)cv2.destroyAllWindows()de…

Windows10-用户账户控制、Windows远程桌面

Windows10用户账户控制怎么设置白名单 问题引出&#xff1a; 安装低版本搜狗输入法后经常弹出用户账户控制 解决方案&#xff1a; 全局模式&#xff1a; UAC控制最早出现在Windows Vista中&#xff0c;用户帐户控制&#xff08;UAC&#xff09;是一项旨在防止对您的计算机…

2024年进入-1/12的世界

1.从一段与AI的对话开始 cj: 1234...无限的&#xff0b;下去结果是无穷大吗&#xff1f; chatgpt: 是的&#xff0c;从常规的数学观点来看&#xff0c;级数 1234… 无限相加的结果是正无穷。 这是因为每一项都是正数&#xff0c;并且随着项数的增加&#xff0c;部分和会趋近…

校园虚拟化部署与横向扩展统一存储

项目背景 这所隶属教育部直属重点大学&#xff0c;学校设有11个学科体系&#xff0c;现有本硕博学生共29000余人&#xff0c;为积极响应“中国教育现代化2023战略部署”&#xff0c;校方制定教育信息化2.0发展目标&#xff0c;通过平台融合&#xff0c;数据驱动、技术赋能等措…

时间序列预测 — LSTM实现单变量滚动风电预测(Keras)

目录 1 数据处理 1.1 数据集简介 1.2 数据集处理 2 模型训练与预测 2.1 模型训练 2.2 模型滚动预测 2.3 结果可视化 1 数据处理 1.1 数据集简介 实验数据集采用数据集5&#xff1a;风电机组运行数据集&#xff08;下载链接&#xff09;&#xff0c;包括风速、风向、温…

【MySQL】binlog数据恢复

binlog概述 binlog二进制日志记录保存了所有执行过的修改操作语句&#xff0c;不保存查询操作。如果 MySQL 服务意外停止&#xff0c;可通过二进制日志文件排查&#xff0c;用户操作或表结构操作&#xff0c;从而来恢复数据库数据。binlog 是逻辑日志&#xff0c;记录的是这个…

网页设计--第5次课后作业

1、快速学习JavaScript的基本知识第1-10章 JavaScript入门 - 绿叶学习网 2、使用所学的知识完成以下练习。需求如下3个&#xff1a; 1&#xff09;点亮灯泡 2&#xff09;将所有的div标签的标签体内容后面加上&#xff1a; very good 3&#xff09;使所有的复选框呈现被选…

编程在现代社会中的重要性

文章目录 编程的重要性引言编程在现代社会中的重要性常见的编程应用场景结语 编程的重要性 引言 编程在现代社会中的重要性是不言而喻的&#xff0c;它可以让我们创造出各种有用的软件&#xff0c;解决各种复杂的问题&#xff0c;甚至改变世界。 编程在现代社会中的重要性 编…

【Unity细节】用代码控制Rigibody的约束RigidbodyConstraints(刚体约束)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

我对自动化测试的一些认识

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

〔005〕虚幻 UE5 像素流多用户部署

✨ 目录 ▷ 为什么要部署多用户▷ 开启分发服务器▷ 配置启动多个信令服务器▷配置启动客户端▷多用户启动整体流程和预览▷注意事项▷ 为什么要部署多用户 之前的像素流部署,属于单用户,是有很大的弊端的打开多个窗口访问,可以看到当一个用户操作界面的时候,另一个界面也会…