android TCP 和 UDP总结

Android Socket通讯TCP和UDP协议Demo 网络通信三要素: IP -- 端口 -- 协议(UDP、TCP) TCP协议 特点: 可靠,速度慢 建立连接通道,数据无限制,面向连接(在正式收发数据前,必须和对方建立可靠的连接,三次对话才能建立连接) UDP协议 特点: 不可靠,但速度快 把数据打包,数据有限制,面向无连接(不与对方建立连接,而是直接就把数据包发送过去) 共同点: 同属于传输层协 阅读详情

    之前写过一些关于TCP和UDP数据传输的代码,比如使用TCP传输音视频数据包,P2P打洞中使用UDP等。写好之后就直接丢下了,没有总结下都。最近准备找工作,再拿来温习下。


1、还是先说点啥

    暂时把自己的定位很明确,就是android应用层的开发,所以关于TCP/UDP的实现细节,暂时也不想去深究。但是心里清楚这个必须去看的,有时间推荐大家看看《TCP/IP详解》,或者网上有很多大牛的总结。


2、TCP

    不知道为什么,这个总结不想写的太细,不贴代码写的细又不知道能总结啥,好纠结,可能就是认识有限吧,公司要是有个架构就好了。不说了,还是安安稳稳的写总结吧。TCP这个可能是我们用的比较多的或者说我用的比较多的,主要的工作还是进行大量数据的传输和心跳保持(想想去年面试的时候都不知道啥是心跳,汗……)。对于心跳保持,就是一个简单的小心跳包;大量数据的传输,这个也总结不了啥东西,代码就那样,就是一些细节说一下。

客户端:这个是我们关注的最多的,也是作为一个手机APP主要关注的,因为我们就是client

a、创建一个client socket

new Socket(ip, prot);
    我们可以通过上面的方式创建一个socket,如果失败,会抛出IOException。参数中的IP和Port是目标服务器的IP和端口号。若你想得到本地的IP和端口可通过这个socket拿到。当然,创建socket还有多种构造方法,比如 new Socket(proxy) ,如果有需要你可以查阅相关说明。

b、发送和接收数据

    拿到socket对象之后我们接着要做的事情就是从这个socket中拿到输入和输出流,这样我们才可以进行数据的发送和接收:
InputStream is = mSocket.getInputStream();
OutputStream out = mSocket.getOutputStream();
    通过输出流,我们可以使用is.read(receiveBuffer)和out.write(data);来进行数据的收发。这里给两个简单实例:
接收数据:
	@Override
	public void execute() {
		try {
			int count = is.read(receiveBuffer);
			if (count == -1) {
				notifyError();
			}
			byte[] data = getPacket(receiveBuffer, count, is);
			mReceiverQueue.put(data);
		} catch (InterruptedException e) {
			e.printStackTrace();
			notifyError();
		} catch (IOException e) {
			e.printStackTrace();
			notifyError();
		}
	}
假如我们的数据包协议格式如下:

这个时候,如果进行大量数据传输的时候我们从InputStream中一次读取的数据可能不是一个完整的数据包。这个时候我们需要做下面的判断:
a、读取的数据长度是否达到包头大小,若没有包头长,继续读,直到达到或者超过包头大小;
b、从包头中解出长度字段,循环读取,直到读到长度字段标示长度为止;
c、校验数据,去除包头,取出包体;
d、重复上述步骤。
发送数据:
	@Override
	public void execute() {
		try {
			byte[] data = mSenderQueue.take();
			out.write(data);
		} catch (InterruptedException e) {
			e.printStackTrace();
			notifyError();
		} catch (IOException e) {
			e.printStackTrace();
			notifyError();
		}
	}
    mSenderQueue和mReceiverQueue一样,都是阻塞队列。发送的时候,我们从队列中取出要发送的数据,然后通过输出流写入即可。这个地方比发送简单了一些。可能你已经注意到,我的发送和接收都用了阻塞队列,这个原因就是考虑到大量数据的时候做一个缓冲,如果没有缓冲,可能导致代码的阻塞。另外就是当我们的阻塞队列充满的时候可以手动丢弃一些数据,这个就是具体应用了。

服务端:这个可以简单了解下,可以java实现,也可C++等实现

    首先,我们创建一个ServerSocket对象并指定一个端口号,通过这个对象的accept()方法等待客户的连接,这个方法是阻塞的;当有客户端连接上来之后,我们就拿到了连接的Socket,拿到这个socket之后的操作就和客户端一样了,最后看一下关键代码:
	try {
		ServerSocket serverSocket = new ServerSocket(9559);
		while (true) {
			Socket socket = serverSocket.accept();
			// new ServiceSocketThread(socket).start();
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
    因为服务端不可能只与一个客户端连接,因此上面的代码写在一个死循环中。拿到socket之后起一个新的线程来处理这个socket。

    最后,还有一点需要注意的是:从Socket中拿到InputStream和OutputStream之后如果关闭它们,socket也将随之关闭(未验证)。

3、UDP

    这个东西用的很少,就是当初测试P2P的时候用过。能想到的问题就是数据大小的问题,比如发送数据我们的数据定义为多大合适。但是最后没有实际的项目验证,在此也不好回答。先贴一段代码出来:

public class UDPServer extends BaseThread {

	/** 发送队列大小 */
	public static final int SENDQUEUESIZE = 10;
	/** 接收队列大小 */
	public static final int RECEIVEQUEUESIZE = 10;
	/** TCP接收缓存大小 */
	public static final int RECEIVERBUFFERSIZE = 1024;
	/** UDP接收缓存大小 */
	public static final int RECEIVERPACKETSIZE = 1024 * 64;

	private int count = 0;
	private DatagramPacket receivePacket;
	private DatagramSocket mSocket;

	@Override
	public boolean prepare() {
		receivePacket = new DatagramPacket(new byte[RECEIVERPACKETSIZE], RECEIVERPACKETSIZE);
		try {
			mSocket = new DatagramSocket(9559);
		} catch (SocketException e) {
			System.out.println(String.format("udp connect init error: %s", e.getMessage()));
			return false;
		}
		return true;
	}

	@Override
	public void execute() {
		try {
			mSocket.receive(receivePacket);

			byte[] data = receivePacket.getData();
			int length = receivePacket.getLength();
			int offset = receivePacket.getOffset();
			System.out.print(++count
					+ String.format("length:%d|%d, offset:%d, data: %s \n", length, data.length, offset, new String(data, "gbk")));
			System.out.println(data[1024]);
		} catch (SocketException e) {
			System.out.println(String.format("udp connect init error: %s", e.getMessage()));
		} catch (IOException e) {
			System.out.println(String.format("udp connect init error: %s", e.getMessage()));
		}
	}
}
    byte[] data = receivePacket.getData();这个地方拿到的data是缓冲区的大小,他们地址是样的,这个大家可以试试就知道。至于这个data中有多少数据,就需要我们通过receivePacket.getLength();拿到。


Android tcp和udp的区别 Android tcp和udp的区别 UDP协议 在数据包中加入端口信息,这就需要新的协议。最简单的实现叫做 UDP 协议,它的格式几乎就是在数据前面,加上端口号。 UDP 数据包,也是由"标头"和"数据"两部分组成。 "标头"部分主要定义了发出端口和接收端口,"数据"部分就是具体的内容。 UDP 数据包非常简单,"标头"部分一共只有8个字节,总长度不超过 65,535 字节,正好放进一个 IP 数据包。 TCP协议 UDP 协议的优点是比较简单,容易实现,但是缺点是可靠性较差,一旦数据包发出,无法知道对方 阅读详情

相关推荐

Simulink机电仿真避坑指南:如何用MATLAB解决液压系统建模的3大典型问题

本文针对液压系统建模在Simulink动态仿真中常见的三大难题——参数物理意义缺失、模型收敛性差及性能优化瓶颈,提供了专业的MATLAB解决方案。文章详细阐述了如何从物理参数推导仿真模型、破解代数环与刚性系统问题,并分享了模型降阶与加速技巧,旨在帮助工程师构建精确高效的机电系统仿真模型。

o9p0q1的博客 295

TCP四次挥手

四次挥手 1.客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。 2.服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就...

孤的博客 469

点餐系统数据库设计--SQL Server

友情链接 1、学生成绩管理系统数据库设计–MySQL 学生成绩管理系统数据库设计–MySQL 2、医疗信息管理系统数据库–MySQL 医疗信息管理系统数据库–MySQL 3、邮件管理数据库设计–MySQL 邮件管理数据库设计–MySQL 4、SQL Server医疗信息管理系统数据库【英文版-源码】–(Medical Management System Database) SQL Server医疗信息管理系统数据库【英文版-源码】–(Medical Management System Database) 5

若如初见 8万+

Android Socket通信(四) -- UDP与TCP结合传输数据

系列文章: Android Socket通信(一) – 初识与相遇 Android Socket通信(二) --UDP,单播,广播和多播(组播) Android Socket通信(三) – TCP 配置和传递基础数据 本系列代码链接:https://github.com/LillteZheng/SocketDemo 在前面几章中,我们已经学习了 tcp 和 udp 基础的方法; ...

夏至的稻穗的博客 2610

车载测试面试题总结

首先确认是什么问题,如果是测试软件的问题就先确定自己的测试方法有没有问题,如果没有问题,那就是测试软件的问题,这时候就需要提bug 进行跟踪,(比如BCM测试的时候,先明确测试的输入,对输入)进行需求分析,然后设计测试用例,进行用例评审,评审完执行测试用例形成最终的版本,台架分为:hil(黑尔)台架,单个控制器的台架、整车台架、车身台架、动力系统台架等,主要验证其功能,或者实车无法满足的测试环境。这个人不可能一直,点击几千次或者多少次几个小时连续点击,人不可能一直在点。因为要模拟一下这个稳定性,

woaxiaoqing的博客 7821

【漏洞修复】Diffie-Hellman Key Agreement Protocol 资源管理错误漏洞(CVE-2002-20001)

Diffie-Hellman Key Agreement Protocol 存在安全漏洞,远程攻击者可以发送实际上不是公钥的任意数字,并触发服务器端DHE模幂计算。

我的博客 1万+

Android视图手册之TCP和UDP(网络协议)

按OSI 7层协议划分,TCP / UDP在传输层,是无法后续非系统层面修改的协议逻辑。

number_cmd9的博客 1512

手把手教你搞定CAC会议投稿:从LaTeX模板到PDF eXpress避坑全流程

本文详细解析CAC会议投稿全流程,重点介绍LaTeX模板调整、Turnitin查重技巧及PDF eXpress校验避坑指南。通过实战案例和代码示例,帮助研究者高效完成IEEE格式论文投稿,避免常见技术性失误,提升投稿成功率。

weixin_29969209的博客 397

Android 网络编程之TCP、UDP详解

本章目录 1、TCP,UDP是什么?2、传输层3、TCP连接的特点有哪些?4、TCP包头格式5、TCP状态机6、三次握手?7、四次挥手?8、TCP连接是怎么保证可靠性的?9、UDP包头格式是啥?10、UDP连接的特点有哪些?11、UDP连接的使用场景有哪些? 本章结构图 1、TCP,UDP是什么? 1.1、为什么要进行网络分层? 在上一篇文章里讲到了网络的分层,提到了TCP/IP组模型, 如下: 但是是否有这样的疑问,为什么网络要进行分层呢? 计算机网络是一个非常复杂的系统,要想在其中两台主机建

十年磨一剑 1090

首个基于LBS方案的3D传感器,VoxelSensor解析

该传感器将结合OQmented的Lissajous模式的MEMS扫描镜,与每帧逐行工作的光栅扫描相比,Lissajous轨迹扫描速度更快,并且能耗很低,它可以更快地捕获完整的场景和快速移动,并且需要更少的数据处理,可满足AR/VR对于低延迟、高效率的需求。简单来讲,Switching Pixels的区别是专注于识别激光事件,性能比普通事件相机更好,但也可以使用事件相机的算法。在具体应用中,它需要在X和Y方向发射一个或多个脉冲光束,以在X和Y轴上定位,而Z轴,也就是深度,则是通过计算光返回的时间来测量。

qingtingwang的博客 576

用户存续期价值评估CLV(三) Gamma-Gamma模型 Python模拟

Gamma-Gamma模型 前面已经提到过,Pareto/NBD和BG/NBD模型只对客户存续时间和交易次数进行建模,并不涉及客户未来交易所带来的现金价值。 Gamma-Gamma模型就是对这个问题的一个扩展解决方案。 Gamma-Gamma模型做了如下假设: 从客户角度上来说,交易金额在每个客户的平均交易价值上随机波动。(这一点并不是很有说服力) 所观察到的交易价值均值是隐含价值均值 ????(????) 的非完美计量 交易价值均值在客户中是变化的,即使这个值是稳定的(这个假设非常大) 在客户中的平

weixin_43171270的博客 4371

Android 面试必备 - 计算机网络基本知识(TCP,UDP,Http,https)

TCP 与 UDP。

D1561691的博客 919

使用Simulink进行四足机器人的非线性动力学建模与仿真

四足机器人的运动包含多个自由度(DOF),包括腿部的摆动和支撑阶段的动力学特性。由于存在接触力、摩擦以及不同地形的影响,四足机器人的动力学行为呈现出高度的非线性特征。因此,构建准确的非线性动力学模型对于研究机器人的运动学和动力学特性至关重要。定义代表机器人状态的变量,如位置、速度、角度和角速度。matlab深色版本通过本指南,我们介绍了如何基于Simulink搭建一个四足机器人的非线性动力学模型,并进行了详细分析。

xiaoheshang_123的博客 311

udp测试android,如何在安卓系统进行UDP和TCP网络测试?【安卓实战】

原标题:如何在安卓系统进行UDP和TCP网络测试?【安卓实战】用心做分享,只为给您最好的学习教程如果您觉得文章不错,欢迎持续学习 有些时候我们身边没有电脑可用,但是你的工作还需要继续,这个时候,利用安卓手机来帮你完成发送和接收TCP和UDP数据包,就显得非常重要了。遗憾的是,很多人找不到一款实用的软件可用来执行操作,很多软件要么过于臃肿,要么有些功能又不够用。基于此,我将为你推荐一个非常实用的工具...

weixin_42298415的博客 1514

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

android udp tcp传输,详解Android 基于TCP和UDP协议的Socket通信

本来想讲一下基础的网络通信方面的知识点,发现太枯燥乏味了,不过笔试中也经常会问到这方面的问题,所以关于通信方面的知识点,小编会放到面试中去,因为实战中也就面试会用到这方面知识点Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信。两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据...

weixin_33673142的博客 860

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android中tcp和udp的区别,tcp和udp使用总结

TCP与Udp的区别tcp:TCP 是面向连接的,并且是一种可靠的协议,在基于 TCP 进行通信时,通信双方需要先建立一个 TCP 连接,建立连接需要经过三次握手,握手成功才可以进行通信1、基于连接的,可靠性高2、有连接过程(3次握手过程),会有延时,实时性较差,3、传输相同的数据时,TCP首部开销20字节;UDP的首部开销小,只有8个字节,TCP报头比UDP复杂,故实际包含的用户数据较少。TCP...

weixin_42502448的博客 1605

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

[android]一个关于UDP和TCP的项目实践(二)

udp和tcp项目开发的第二篇

幸福的小骁仔的博客 728

Android中使用TCP和UDP

TCP和UDP在网络传输中非常重要,在Android开发中同样重要。 首先我们来看一下什么是TCP和UDP。 什么是TCP? TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。在简化的

CHarles 2604

Android开发:如何实现TCP和UDP传输

Android开发:如何实现TCP和UDP传输 2010-09-06 09:43 佚名 ideasandroid 我要评论(1) 字号:T | T 本文将为各位讲述在Android下完成TCP和UDP传输的解决办法,TCP和UDP在网络传输中非常重要,在Android开发中同样重要。 AD: TCP和UDP在网络传输中非常重要,

hao201011的专栏 723

TCP和UDP的优缺点及区别,安卓面试

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。最后针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!ndroid进阶实践技术;

m0_60707538的博客 497

Android开发:如何实现TCP和UDP传…

首先我们来看一下什么是TCP和UDP。 什么是TCP? TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。应用层向TCP层发送用于网间传输的、

168

android Tcp和Udp介绍

TCP(Transmission Control Protocol)---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。     UDP(User Datagram Protocol)---用户数据报协议,是一个简

倾听雨落 2148

Android中实现TCP和UDP传输实例

TCP和UDP在网络传输中非常重要,在Android开发中同样重要。 首先我们来看一下什么是TCP和UDP。 什么是TCP? TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。在简化的计算机网络OSI模型

jyqqhw_41的专栏 719

Android中实现TCP和UDP传输的方法

TCP和UDP在网络传输中非常重要,在Android开发中同样重要。   首先我们来看一下什么是TCP和UDP。   什么是TCP?   TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified)。在简

929
上一篇: android网络开源框架volley(四)——谈谈图片加载
下一篇: android网络开源框架volley(四)——谈谈图片加载续——九张图片相册的展示(微信微博等)
ttdevs
博客等级 码龄15年 388粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值