Android开发-Android开发中的TCP与UDP通信策略的实现

news2025/3/15 19:53:03

Android 开发中的 TCP 与 UDP 通信策略的实现

  • 1. 前言
  • 2. 准备工作
  • 3. Kotlin 中 TCP 通信实现
      • 客户端代码示例:
      • 服务器代码示例:
  • 4. Kotlin 中 UDP 通信实现
      • 客户端代码示例:
      • 服务器代码示例:
  • 5. TCP 与 UDP 应用场景分析
      • TCP 实现可靠传输主要依靠以下几个机制:
      • TCP 面向字节流,UDP 面向报文?
  • 6. 结语

1. 前言

在移动互联网时代,Android 应用开发常常涉及网络通信,其中 TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)作为传输层的两种核心协议,各自扮演着不可或缺的角色。本文将深入探讨这两者在 Android 开发中的应用,辅以 Kotlin 语言的实际代码示例,帮助开发者更好地理解和掌握这两种通信方式。

TCP 和UDP 是两种截然不同的通信协议。TCP 以其可靠性著称,适合需要确保数据完整性和顺序的场景;而 UDP 则以其轻量级、低延迟的特性,成为实时性和效率优先场景下的首选。在 Android 平台上,无论是构建高性能的游戏、实时通信应用,还是稳健的信息交换服务,理解并正确选择 TCP 或 UDP,都是至关重要的。

2. 准备工作

在开始编写代码之前,请确保你的 AndroidManifest.xml 文件中已添加了网络权限:

<uses-permission android:name="android.permission.INTERNET" />

3. Kotlin 中 TCP 通信实现

TCP 建立在连接的基础上,因此在数据传输前需要进行连接的建立与断开。

客户端代码示例:

import java.io.*
import java.net.Socket

fun tcpClient(ip: String, port: Int) {
    try {
        val socket = Socket(ip, port)
        val outputStream = PrintWriter(socket.getOutputStream(), true)
        val inputStream = BufferedReader(InputStreamReader(socket.getInputStream()))

        outputStream.println("Hello from TCP Client!")
        println("Sent: Hello from TCP Client!")

        val serverResponse = inputStream.readLine()
        println("Received: $serverResponse")

        outputStream.close()
        inputStream.close()
        socket.close()
    } catch (e: IOException) {
        e.printStackTrace()
    }
}

服务器代码示例:

import java.io.*
import java.net.ServerSocket

fun tcpServer(port: Int) {
    try {
        val serverSocket = ServerSocket(port)
        println("TCP Server is listening on port $port...")

        while (true) {
            val clientSocket = serverSocket.accept()
            println("New client connected")

            val inputStream = BufferedReader(InputStreamReader(clientSocket.getInputStream()))
            val outputStream = PrintWriter(clientSocket.getOutputStream(), true)

            val message = inputStream.readLine()
            println("Received: $message")

            outputStream.println("Hello from TCP Server!")
            
            inputStream.close()
            outputStream.close()
            clientSocket.close()
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }
}

4. Kotlin 中 UDP 通信实现

UDP 是无连接的协议,数据报的发送和接收更为直接,但不保证数据的到达和顺序。

客户端代码示例:

import java.net.*

fun udpClient() {
    val clientSocket = DatagramSocket()
    val ipAddress = InetAddress.getByName("localhost")
    val sendData = "UDP Client says Hi!".toByteArray()

    val packet = DatagramPacket(sendData, sendData.size, ipAddress, 12345)
    clientSocket.send(packet)

    println("UDP message sent.")

    clientSocket.close()
}

服务器代码示例:

import java.net.*

fun udpServer() {
    val serverSocket = DatagramSocket(12345)
    println("UDP Server is running.")

    val receiveBuffer = ByteArray(1024)
    val receivePacket = DatagramPacket(receiveBuffer, receiveBuffer.size)

    serverSocket.receive(receivePacket)
    val message = String(receivePacket.data, 0, receivePacket.length)
    println("Received: $message from ${receivePacket.address.hostAddress}")

    val replyMessage = "UDP Server acknowledges your greeting!".toByteArray()
    val replyPacket = DatagramPacket(replyMessage, replyMessage.size, receivePacket.address, receivePacket.port)
    serverSocket.send(replyPacket)

    println("Reply sent.")
    serverSocket.close()
}

5. TCP 与 UDP 应用场景分析

  • TCP:适用于文件传输、网页浏览、邮件服务等,任何对数据完整性和顺序敏感的应用。TCP的重传机制和流量控制确保了数据的可靠传输,尽管这可能带来较高的延迟。

  • UDP:在实时性要求高的应用中,如在线游戏、即时消息、语音和视频通话中,UDP的低延迟特性极为关键。尽管UDP不保证数据的到达,但它允许开发者自行设计更灵活的错误处理和流量控制策略,以适应实时交互的需求。

TCP 实现可靠传输主要依靠以下几个机制:

  • 序号和确认应答(Sequence and Acknowledgment):TCP 为每个数据包分配一个序号,接收方对收到的数据包发送确认应答,发送方只有在收到确认应答后才认为该数据包已成功送达。如果发送方没有在一定时间内收到确认,它会重新发送数据包。

  • 校验和(Checksum):TCP 头中包含校验和字段,用于检测数据在传输过程中是否损坏。如果接收方发现数据包损坏,它会要求发送方重发。

  • 流量控制(Flow Control):通过滑动窗口协议来实现,接收方通知发送方其缓冲区的大小,发送方据此调整发送速率,避免数据包发送过快导致接收方来不及处理而溢出。

  • 拥塞控制(Congestion Control):当网络拥堵时,TCP 会减少数据的发送速率,通过慢启动、拥塞避免、快速重传和快速恢复等机制动态调整发送速率,以减轻网络拥塞。

  • 连接管理(Connection Management):TCP 是面向连接的协议,通信双方在数据传输前需要先建立连接,数据传输完毕后还需要断开连接,这保证了双方通信的可靠性。

TCP 面向字节流,UDP 面向报文?

“TCP 面向字节流”意味着 TCP 把应用程序看作是一连串无结构的字节流,TCP 并不关心这些字节流的边界,它会根据当前网络状况自动地将数据分割成合适的数据包进行传输,并在接收端将这些数据包重新组合成原始的字节流,因此对于应用层来说,TCP 提供的是一个像水管一样连续的数据流服务。

相比之下,“UDP 面向报文”表示用户数据报协议(User Datagram Protocol)保留了每个数据报的边界,它不拆分也不重组数据报,每个 UDP 数据报都是独立传输的,接收方会按照发送方发送的顺序接收到这些数据报。UDP 不保证数据包的顺序、可靠传输或重复,它提供的是一个无连接的、不可靠的服务,但正因为如此,UDP 传输速度通常比 TCP 更快,且开销更小。

6. 结语

通过上述示例和分析,我们不仅掌握了在 Android 开发中使用 Kotlin 实现 TCP 和 UDP 通信的基础,还理解了它们各自的适用场景。在实际项目中,开发者应根据应用的具体需求,权衡可靠性和效率,合理选择通信协议。记住,无论选择哪种协议,都需要充分考虑网络状态的变化,设计健壮的网络错误处理逻辑,以提升用户体验。


———————— The end ————————

码字不易,如果您觉得这篇博客写的比较好的话,可以赞赏一杯咖啡吧~~
在这里插入图片描述


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

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

相关文章

词条唤夜兽唤夜兽的养殖与护理 幻兽帕鲁 唤夜兽怎么获取 唤夜兽去哪里抓 crossover玩Steam游戏

唤夜兽在地图上没有出现&#xff0c;是唤冬兽和雷冥鸟共同培育出来的帕鲁。 ------------------------- 介绍&#xff1a; 帕洛斯群岛之守护神&#xff0c;拥呼唤黑夜之力。 其会于灾厄席捲大地之际腾空而起&#xff0c;唤来无尽暗夜&#xff0c;试图封印灾厄。 ---------…

Video-FocalNets: Spatio-Temporal Focal Modulation for Video Action Recognition

标题&#xff1a;Video-FocalNets&#xff1a;用于视频动作识别的时空聚焦调制 源文链接&#xff1a;Wasim_Video-FocalNets_Spatio-Temporal_Focal_Modulation_for_Video_Action_Recognition_ICCV_2023_paper.pdf (thecvf.com)https://openaccess.thecvf.com/content/ICCV202…

深入解析文华量化交易策略---交易指令如何选择

随着金融投资的迅猛发展&#xff0c;自动化策略模型已逐渐成为现代投资领域的一股重要力量。量化交易模型均以数据为驱动&#xff0c;通过运用数学模型和算法&#xff0c;对期货、黄金等投资市场走势进行精准预测和高效交易。 艾云策略整理了量化策略相关资料&#xff0c;希望通…

从零开始搭建一个SpringBoot项目

目录 Spring BootSpring Boot 项目开发环境1、快速创建SpringBoot项目2、pom.xml 添加 Meavn 依赖3、配置application.yml4、验证数据库是否连接成功5、配置 Druid 数据源 Spring Boot 整合 MyBatis1、准备依赖2、application-dev.yml 配置3、启动类添加Mapper接口扫描器4、设置…

【Python搞定车载自动化测试】——Python基于Pytest框架实现UDS诊断自动化(含Python源码)

系列文章目录 【Python搞定车载自动化测试】系列文章目录汇总 文章目录 系列文章目录&#x1f4af;&#x1f4af;&#x1f4af; 前言&#x1f4af;&#x1f4af;&#x1f4af;一、环境搭建1.软件环境2.硬件环境 二、目录结构三、源码展示1.诊断基础函数方法2.诊断业务函数方法…

09.自注意力机制

文章目录 输入输出运行如何运行解决关联性attention score额外的Q K V Multi-head self-attentionPositional EncodingTruncated Self-attention影像处理vs CNNvs RNN图上的应用 输入 输出 运行 链接&#xff08;Attention Is All You Need&#xff09; 如何运行 解决关联性 a…

Iphone自动化指令每隔固定天数打开闹钟关闭闹钟

1.业务需求&#xff1a;小z每隔五天有一个夜班&#xff0c;然后下午会有三个小时的休息时间&#xff0c;如果闹钟不响就会错过交班日期&#xff0c;但是如果设置闹钟&#xff0c;iPhone的闹钟只能设定固定循环日期闹钟&#xff0c;或者一次的闹钟&#xff0c;导致要么忘记设闹钟…

【网络安全】社会工程学攻击与防范

一、社会工程学概述 1、社会工程学的定义 通过利用人们的心理弱点、本能反应、好奇心、信任、贪婪等一些心理陷阱进行的诸如欺骗、伤害、信息盗取、利益谋取等对社会及人类带来危害的行为或方法。 当网络恶意攻击者无法通过纯粹的计算机技术达到目的时&#xff0c;高超的情商…

【Text2SQL】WikiSQL 数据集与 Seq2SQL 模型

论文&#xff1a;Seq2SQL: Generating Structured Queries from Natural Language using Reinforcement Learning ⭐⭐⭐⭐⭐ ICLR 2018 Dataset: github.com/salesforce/WikiSQL Code&#xff1a;Seq2SQL 模型实现 一、论文速读 本文提出了 Text2SQL 方向的一个经典数据集 —…

Amesim应用篇-电芯等效电路模型标定

前言 为了使计算模型更加准确,在有电芯实验测试数据的情况下,依据现有的实验数据对Amesim中的电池等效电路模型进行标定。标定的目的是为了获得更加符合项目实际情况的电芯等效电路模型,标定完的电芯可以用于搭建PACK模型,也可以用于其他虚拟实验。本文以充电标定为例,进…

ideal 启动 多个 相同 工程

spring相同项目在idea多次运行 点击IDEA右上角项目的隐藏下拉框&#xff0c;出现下拉列表&#xff0c;点击Edit Configurations 弹出Run/Debug Configuration对话框&#xff0c;勾选Allow parallel run

vue实战 ---- 社交媒体---黑马头条项目

vue基础 1.介绍 为什么会有Vuex ? ​ Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 vuex是采用集中式管理组件依赖的共享数据的一个工具&#xff0c;可以解…

21-信号集处理函数

屏蔽信号集 屏蔽某些信号 手动自动 未处理信号集 信号如果被屏蔽&#xff0c;则记录在未处理信号集中 非实时信号&#xff08;1~31&#xff09;&#xff0c;不排队&#xff0c;只留一个实时信号&#xff08;34~64&#xff09;&#xff0c;排队&#xff0c;保留全部 信号集…

7. Spring MVC面试题汇总

Java全栈面试题汇总目录-CSDN博客 1. 什么是Spring MVC&#xff0c;简单介绍下你对Spring MVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;通过把Model&#xff0c;View&#xff0c;Controller分离&#xff0c;将web层进…

Jenkins安装部署--图文详细

Jenkins–从入门到入土 文章目录 Jenkins--从入门到入土一、Jenkins安装部署1、什么是Jenkins?2、Jenkins在开发过程中所属位置3、安装硬件环境和知识储备4、安装4.1、下载war启动4.2、Docker启动4.3、windows使用驱动安装 5、使用插件自定义 Jenkins6、创建第一个管理员用户 …

1+x(Java)中级题库易混淆理论题

<ALL表示小于最小 小于最高等同于小于ANY 使用USING子句&#xff0c;在使用连接字段时&#xff0c;都不能在前面加上表的前缀&#xff0c;因为此时这个字段已经是连接字段&#xff0c;不再属于某个单独的表。 数据库提供的自动将提供的数据类型数据转换为期望的数据类…

SpringBoot3笔记(一)SpringBoot3-核心特性

快速学习 SpringBoot 看官方文档&#xff1a; Spring Boot Reference Documentation 计划三天学完 笔记&#xff1a;https://www.yuque.com/leifengyang/springboot3 代码&#xff1a;https://gitee.com/leifengyang/spring-boot-3 一、SpringBoot3 - 快速入门 1.1 简介 …

深入解析:如何高效地更新Python字典

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、修改字典中的值 三、向字典中添加键值对 四、更新字典的两种方法总结 五、…

Re72:读论文 XLM Cross-lingual Language Model Pretraining

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名&#xff1a;Cross-lingual Language Model Pretraining 模型简称&#xff1a;XLM ArXiv地址&#xff1a;https://arxiv.org/abs/1901.07291 这是2019年NeurIPS的论文&#xff0c;主要做到就是跨语言…

第十一届蓝桥杯物联网试题(国赛)

国赛题目看着简单其实还是挺复杂的&#xff0c;所以说不能掉以轻心&#xff0c;目前遇到的问日主要有以下几点&#xff1a; 本次题主要注重的是信息交互&#xff0c;与A板通信的有电脑主机和B板&#xff0c;所以处理好这里面的交互过程很重要 国赛中避免不了会收到其他选手的…