热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android网络编程之TCP/UDP学习

Android网络编程之TCPUDP学习本文部分资料来源于网络,仅作为学习纪录用途。Andorid网络编程简介:通过网络实现客户端与服务端数据的共享

Android网络编程之TCP/UDP学习

本文部分资料来源于网络,仅作为学习纪录用途。

Andorid网络编程简介:

通过网络实现客户端服务端数据的共享访问

网络通讯模型

开放系统互连参考模型:

  • 应用层:通讯的应用程序(类似快递客户端)
  • 表示层:数据的表示格式(类似快递的种类)
  • 会话层:开始、控制和结束一个会话(类似快递点接揽业务)
  • 传输层:网络传输的通讯规则(类似快递运输的方式和规则)
  • 网络层:识别目标机器的IP地址(类似快递投放的目标地点)
  • 数据链路层:单个链路传输数据规则,主要由运营商来定义。(类似快递公司对于具体城市定义的规则)
  • 物理层:传输介质的特性标准(类似快递运输的过程)

TCP/IP 模型 4 层:

  • 应用层
  • 传输层
  • 网络层
  • 主机至网络层

image_1c90ct42t3l326e84b16va79.png-87.6kB

一个应用层应用一般都会使用到两个传输层协议之一:
面向连接的 TCP 传输控制协议和面向无连接的 UDP 用户数据报协议。

下面分析 TCP/IP 协议栈中常用的 IP、 TCP 和 UDP 协议。

  • TPC面向连接,具有可靠性,流控制,错误恢复等特性。
  • UDP面向无连接,比较简单,UDP头包含字节较少,所以比TCP负载消耗少。

UDP 用来支持那些需要在计算机之间传输数据的网络应用,包括网络视频会议系统在内的众多的客户端 / 服务器模式的网络应用都需要使用UDP协议。 UDP 协议的主要作用是将网络数据流量压缩成数据报的形式。

网络三要素


  • IP地址:32位二进制,划分为4段,每段范围0-255,采用十进制表示。

    1. A类IP地址
    一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”, 地址范围从1.0.0.0 到126.0.0.0。可用的A类网络有126个,每个网络能容纳1亿多个主机。

    2. B类IP地址
    一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128.0.0.0到191.255.255.255。可用的B类网络有16382个,每个网络能容纳6万多个主机 。

    3. C类IP地址
    一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255。C类网络可达209万余个,每个网络能容纳254个主机。

    4. D,E类IP地址不常用,另外127.0.0.1是本机回环地址。

  • 端口号

    1. 用于标识进程的逻辑地址,不同进程的标识
    2. 有效端口:0~65535,其中0-1024系统使用或保留端口
    3. 一般说的都是软件意义上的端口
    4. IP地址类似于门牌号,端口类似于房间号
  • 传输协议

    1. TCP
      TCP(Transmission Control Protocol 传输控制协议
      面向连接,基于字节流的传输层通信协议。
      位于IP协议之上,可靠的端对端协议
      重发技术,保证数据内容准确
      大数据量传输
      三次握手完成连接,属于可选协议
      必须建立连接,效率稍低
      类似于打电话

    2. UDP
      用户数据报协议
      无连接,速度快,不可靠的传输层协议
      位于IP协议之上,即UDP数据报(64K内)是封装在IP数据包中进行传输
      类似于发快递,发短信,常用于网络视频会议等情景

    3. IP
      TCP/IP协议模型中关键部分,Internet中所有数据包都通过IP包的方式进行传输。
      能够适应不同的网络硬件。
      无连接
      不可靠

InetAddress.java

* @see java.net.InetAddress#getByAddress(byte[])
* @see java.net.InetAddress#getByAddress(java.lang.String, byte[])
* @see java.net.InetAddress#getAllByName(java.lang.String)
* @see java.net.InetAddress#getByName(java.lang.String)
* @see java.net.InetAddress#getLocalHost()

Socket对象


  • 套接字,为网络服务提供的一种机制
  • 通信两端都是Socket
  • 应用程序通过Socket向网络发送请求或响应网络请求
  • 位于会话层

TCP工作流程

TCP 服务器端工作的主要步骤如下。
步骤 1 调用 ServerSocket( int port) 创建一个 ServerSocket, 并绑定到指定端口上。
步骤 2 调用 accept(), 监听连接请求, 如果客户端请求连接, 则接受连接,返回通信套接字。
步 骤 3  调 用 Socket 类 的 getOutputStream() 和 getInputStream() 获 取 输 出 和 输 入 流,
开始网络数据的发送和接收。
步骤 4 关闭通信套接字。

示例代码如下所示:

public class TcpReceiveDemo {public static void main(String[] argv) throws IOException {// 1. 创建serverSocket服务器端对象 监听具体的端口ServerSocket ss = new ServerSocket(10002);// 2. 获取具体的连接客户端对象Socket s = ss.accept(); // 阻塞式String ip = s.getInetAddress().getHostAddress();System.out.println(ip + "--------connected---------");// 3. 通过客户端对象获取读取流对象,读取客户端发送的消息InputStream in = s.getInputStream();byte[] buff = new byte[1024];int len = in.read(buff);String str = new String(buff, 0, len);System.out.println("Client: " + str);// 4. 获取socket对象,将数据写入客户端OutputStream out = s.getOutputStream();out.write("已收到".getBytes());// 5. 关闭流对象s.close();ss.close();}
}

TCP 客户端工作的主要步骤如下。
步骤 1 调用 Socket() 创建一个流套接字, 并连接到服务器端。
步骤 2 调用 Socket 类的 getOutputStream() 和 getInputStream() 方法获取输出和输入
流, 开始网络数据的发送和接收。
步骤 3 关闭通信套接字。

编写 TCP 客户端代码如下所示:

public class TcpSendDemo {public static void main(String[] argv) throws IOException {// 1. 创建客户端socket服务 指定目标地址及端口Socket s = new Socket("192.168.0.103", 10002);// 2. 通过socket对象向服务器写入数据OutputStream out = s.getOutputStream();out.write("Hello,服务器!!".getBytes());// 2.1 通过socket对象获取服务器返回的数据InputStream in = s.getInputStream();byte[] buff = new byte[1024];int len = in.read(buff);String str = new String(buff, 0, len);System.out.println("server: " + str);// 3. 关闭资源s.close();}
}

测试流程同下面的UDP
image_1c90mgd5e1j3o8kfati1gjc7jd9.png-135.6kB

UDP工作流程

UDP 服务器端工作的主要步骤如下。
步骤 1 调用 DatagramSocket(int port) 创建一个数据报套接字, 并绑定到指定端口上。
步骤 2 调用 DatagramPacket( byte[]buf,int length), 建立一个字节数组以接收 UDP 包。
步骤 3 调用 DatagramSocket 类的 receive(), 接受 UDP 包。
步骤 4 关闭数据报套接字。

public class UdpReceiveDemo {public static void main(String[] argv) throws IOException {// 建立udp socket服务DatagramSocket socket = new DatagramSocket(9527);while(true){byte[] buff = new byte[1024];// 准备用于存储发送数据的数据包DatagramPacket dp = new DatagramPacket(buff, buff.length);// 阻塞式的接收方法socket.receive(dp);String ip = dp.getAddress().getHostAddress();String text = new String(dp.getData(), 0, dp.getLength());System.out.println("ip:" + ip + "; 发送内容:" + text + "; 端口:" + dp.getPort());}// 由于这里一直在等待接收数据包,所以没有关闭资源// socket.close();}
}

UDP 客户端工作的主要步骤如下。
步骤 1 调用 DatagramSocket() 创建一个数据包套接字。
步骤 2 调用 DatagramPacket( byte[]buf,int offset,int length,InetAddress address,int port),
建立要发送的 UDP 包。
步骤 3 调用 DatagramSocket 类的 send() 发送 UDP 包。
步骤 4 关闭数据报套接字。

public class UdpSendDemo {public static void main(String[] argv) throws IOException {// 建立udp socket服务DatagramSocket socket = new DatagramSocket(8888);// 准备需要发送的数据BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String line = null;while ((line = br.readLine()) != null) {byte[] buff = line.getBytes(); // 数据转换成字节数组// 将需要发送的数据封装成数据包DatagramPacket dp = new DatagramPacket(buff, buff.length, InetAddress.getByName("192.168.0.103"),9527);// 调用send方法将数据包发送socket.send(dp);if ("886".equals(line)) {break;}}// 关闭资源socket.close();}
}

  • 发送端端口8888和接收端端口9527都是自定义的
  • 192.168.0.103是接收端的地址,由于在本地主机上做实验,所以用的是本机IP
  • BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) 将标准输入流转换成BufferedReader。

联合测试查看实验现象:
1. 将发送和接收端两个java文件单独拷贝出来,并去掉文件中的包名
2. 使用javac分别编译,并在两个终端中使用java运行。
3. 在运行发送端程序的终端输入字符,并在运行接收端程序的终端进行查看
实验现象:
image_1c90kpjp716o6o496s41a71dgj9.png-91.8kB

项目源码地址


推荐阅读
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Ihavethefollowingonhtml我在html上有以下内容<html><head><scriptsrc..3003_Tes ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
author-avatar
1510193264a
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有