当前位置: 首页 > news >正文

网络请求(四)—Socket

C/S结构:即客户端/服务器结构,是软件系统体系结构;充分利用两端硬件环境的优势,将任务合理分配到ClientServer端来实现,降低了系统的通信开销。

Socket套接字,是一个对TCP/IP协议进行封装的编程调用接口,属于传输层,即通过Socket,才可以在Android平台上进行TCP/IP协议开发,为通信双方的数据传输提供通道。

Socket

Socket的使用可以基于TCP或者UDP协议。

TCP协议(Transmission Control Protocol),即传输控制协议,是一种传输层通信协议。基于TCP的应用层协议由FTPTelnetSMTPHTTPPOP3DNS 特点是:

  • 面向连接:指的是要使用TCP传输数据,必须先建立TCP连接,传输完成后释放连接;
  • 全双工通信:即一旦建立了TCP连接,通信双方可以在任何时候发送数据;
  • 可靠:指的是通过TCP连接传输的数据,无差错、不丢失、无重复,并且按序到达;
  • 面向字节流:流指的是在进程中流入流出的字符序列。简单来说,虽然有的时候传输的数据流太大,TCP报文有长度限制,不能一次性传输完,需要把它分成好几个数据块,但又要保证可靠性,接收方可以按顺序接收数据块然后重组成之前的数据流;

UDP协议(User Datagram Protocol),即用户数据报协议,是一种传输层通信协议。基于UDP的应用层协议有TFTPSNMPDNS 特点是:

  • 无连接:UDP传输数据不需要建立连接;
  • 不可靠:因为UDP数据包发出去就不管了,不管它会不会到达,可能会出现丢包的现象;
  • 面向报文:数据报文,相当于一个数据包。不管应用层交给UDP多大的数据包,UDP都照样发送,不会像TCP那样拆分;
  • 没有阻塞控制:阻塞是指通信子网中某一部分的分组数量过多,使得该部分晚了来不及处理,以至隐去这部分乃至于整个网络性能下降的情况。TCP建立连接后如果遇到类似的情况,导致发送的数据无法到达目的地,它会不断的重复,就会使得网络越来越阻塞,所以需要一个复杂的原理来控制阻塞。而UDP没有个这个问题;

UDP的应用场景:很多的实时应用,如IP电话、实时视频会议等要求源主机以很快的速率发送数据,并且允许在网络阻塞时可以丢失一些数据,但是要求不能有太大的延迟,这个时候就可以考虑UDP

Android中客户端与服务端的通信方式有两种:HTTPSocket

  • Http属于应用层,采用请求-响应的方式发送数据,即建立网络连接后,在客户端向服务端发送请求后,服务端才向客户端发送数据;
  • Socket属于传输层,采用主动发送数据的方式,即建立网络连接后,服务端可以主动发送消息给客户端,而不需要客户端向服务端发送请求;

Socket的使用类型主要有两种:

  • 流套接字(streamsocket):基于TCP协议,采用流的方式提供可靠的字节流服务;
  • 数据报套接字(datagramsocket):基于UDP协议,采用数据报文提供数据打包发送的服务;

基于TCP协议的Socket:客户端创建一个Socket对象,指定服务器端的IP地址和端口号,通过InputStream读取服务端发送的数据:

try {
    Socket socket = new Socket("172.16.10.108", 8080);
    InputStream inputStream = new FileInputStream("e://a.txt");
    OutputStream outputStream = socket.getOutputStream();
    byte buffer[] = new byte[4 * 1024];
    int temp = 0;
    while ((temp = inputStream.read(buffer)) != -1) {
      outputStream.write(buffer, 0, temp);
    }
    outputStream.flush();
} catch (IOException e) {
  	e.printStackTrace();
}

基于UDP协议的Socket:客户端创建一个DatagramSocket对象,并且指定监听的接口:

// 客户端发送数据
try {
    DatagramSocket socket = new DatagramSocket(1985);
    InetAddress inetAddress = InetAddress.getByName("192.168.1.32");
    String string = "哈哈哈哈哈哈";
    byte[] data = string.getBytes();
    DatagramPacket packet = new DatagramPacket(data, data.length, inetAddress, 10025);
    socket.send(packet);
} catch (IOException e) {
  	e.printStackTrace();
}

// 客户端接收数据
try {
    DatagramSocket socket = new DatagramSocket(1985);
    byte[] data = new byte[4 * 1024];
    DatagramPacket packet = new DatagramPacket(data, data.length);
    socket.receive(packet);
    String result = new String(packet.getData(), packet.getOffset(), packet.getLength());
    socket.close();
} catch (IOException e) {
  	e.printStackTrace();
}

参考

@Android:这是一份很详细的Socket使用攻略
基于android的Socket通信
Android必备: Socket编程的了解与学习整理

相关文章:

  • Python中的模块
  • JavaEE、Spring
  • setTimeout和setInterval区别,以及定时器的传参功能
  • 【数学分析笔记04】数列与数列极限
  • 1、设计模式的简介
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • deepstream--nvinfer
  • python+vue+elementui企业会议管理系统django
  • centos 部署java环境,拷贝jar包并运行
  • 支持在线写SQL的Oracle学习免费网站(个人常使用)
  • ESP8266-Arduino编程实例-SHT20温湿度传感器驱动
  • 【web-代码审计】(14.5)PHP
  • Waline评论服务docker自部署手册 + 无需备案域名配置
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • C++后台开发学习路线(已多人拿下腾讯后台开发)
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • bootstrap创建登录注册页面
  • centos安装java运行环境jdk+tomcat
  • flutter的key在widget list的作用以及必要性
  • Java面向对象及其三大特征
  • Just for fun——迅速写完快速排序
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • 理解在java “”i=i++;”所发生的事情
  • 判断客户端类型,Android,iOS,PC
  • #13 yum、编译安装与sed命令的使用
  • #if 1...#endif
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Note)C++中的继承方式
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (黑马C++)L06 重载与继承
  • (一) springboot详细介绍
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (译) 函数式 JS #1:简介
  • (译)2019年前端性能优化清单 — 下篇
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET和.COM和.CN域名区别
  • /etc/motd and /etc/issue
  • @RestControllerAdvice异常统一处理类失效原因
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [android] 练习PopupWindow实现对话框
  • [Avalon] Avalon中的Conditional Formatting.
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [DevOps云实践] 彻底删除AWS云资源
  • [Electron] 将应用打包成供Ubuntu、Debian平台下安装的deb包
  • [lesson17]对象的构造(上)
  • [LWC小知识] 标准lightning-input-field怎么取得变更值(onchange)