socket学习
时间:2020-04-22
本文章向大家介绍socket学习,主要包括socket学习使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、Socket原理
- 什么是socket?
- Socket是TCP/IP协议的一组API,位于应用层与传输层之间;
- Ip地址与端口的组合称作socket(套接字),例如:127.0.0.1:80就是一个套接字,可以唯一定位计算机上的一个进程;
- Socket是传输层网络通信连接的端点,一个通信连接由一对套接字组成(可以简单的理解为两点连一线)。
- Socket有什么用?
- 使程序员可以方便的调用TCP/IP协议进行通信;
- 可以唯一的标识多个应用程序之间的传输层连接。
- Socket的输入输出缓冲区
每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从缓冲区发送到目标机器。一旦将数据写入到缓冲区,函数就可以成功返回,不管它们有没有到达目标机器,也不管它们何时被发送到网络,这些都是TCP协议负责的事情。TCP协议独立于 write()/send() 函数,数据有可能刚被写入缓冲区就发送到网络,也可能在缓冲区中不断积压,多次写入的数据被一次性发送到网络,这取决于当时的网络情况、当前线程是否空闲等诸多因素,不由程序员控制。read()/recv() 函数也是如此,也从输入缓冲区中读取数据,而不是直接从网络中读取。
这些I/O缓冲区特性可整理如下:
- I/O缓冲区在每个TCP套接字中单独存在;
- I/O缓冲区在创建套接字时自动生成;
- 即使关闭套接字也会继续传送输出缓冲区中遗留的数据;
- 关闭套接字将丢失输入缓冲区中的数据。
二、Socket使用
- Python中创建socket服务端:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((host, port))
sock.listen()
clientsocket, addr = sock.accept()
- socket.AF_INET表示使用IPv4协议;socket.SOCK_STREAM表示使用TCP协议,此外还有socket.SOCK_DGRAM表示使用UDP协议;
- sock.bind()绑定socket到某地址,如果为0.0.0.0则表示任意地址可以连接;
- sock.listen()使socket开始监听连接;
- sock.accept()等待接受连接,该函数会阻塞程序,如果有连接进入,会返回接入客户端的socket和地址。
- Python中连接socket:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
- 建立一个客户端socket,同样使用socket.AF_INET, socket.SOCK_STREAM参数
- 上述代码中s.connect((host,port))连接到特定的socket(这里为host:port)。
- 对host参数做一点说明:
- 服务器端bind((host, port))函数中的host指代的应该是客户端的ip地址,因此如果设置为127.0.0.1则只有本机的客户端才能连接到服务端socket(虽然在看到的各种文章中貌似这都是共识,但是我在理解和使用的过程中还是出现过疑惑);
- 客户端connect((host, port))函数中的host指代的是服务端的ip地址。
三、其他
- socket在实际应用中一般是与多路复用技术一起使用的,在python中可以使用selectors包。
- 对于现代的程序员来说,越来越不需要了解这些比较底层的知识了,但是我恰恰觉得这些底层的知识是最应该去好好学习的了。不管任何技术都不可能凭空出现,都是它们是在底层技术的基础上建立起来的,如果我们对底层的原理了解的足够多,那么以后遇到任何新技术,都可以很快掌握它们的实现原理,达到举一反三的效果。
- 在项目中进行学习才会有学习的动力,在学习的过程中做好总结和输出才能更好的掌握。
- 最后推荐一篇很好的socket教程点这里
原文地址:https://www.cnblogs.com/sniperd/p/12752423.html
- 厚土Go学习笔记 | 38. goroutine轻量级线程
- 厚土Go学习笔记 | 37. 图片(image)生成器
- 编写地道的Go代码
- 开发你不能忽略的问题?JavaScript(JS)
- 厚土Go学习笔记 | 36. web服务指定路径下的get参数接收与处理
- 用R进行文本分析初探——包含导入词库和和导入李白语句
- Golang事务模型
- 厚土Go学习笔记 | 35. web服务器实现动态路径
- 过滤器Filter精华知识点,怎能不看
- JavaMail开发示例,学习要看对资料
- 厚土Go学习笔记 | 34. 一个简单的 web 服务器实现
- sqlplus / as sysdba无法登录的奇怪报错 (r8笔记第36天)
- JSP与EL表达式重点学习笔记(1)
- R语言读CSV、txt文件方式以及read.table read.csv 和readr(大数据读取包)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CF--思维练习--CodeForces - 221C-H - Little Elephant and Problem (思维)
- CF--思维练习--CodeForces - 219C Color Stripe (思维)
- 疯子的算法总结(六) 简单排序总 选择排序+插入排序+比较排序+冒泡排序
- C语言基础知识总结
- CF思维联系--CodeForces - 218C E - Ice Skating (并查集)
- 数组及字符串相关知识
- C++循环结构
- C++条件分支结构
- USACO Training Section 1.1 贪婪的送礼者Greedy Gift Givers
- 数学--数论--HDU--5878 Count Two Three 2016 ACM/ICPC Asia Regional Qingdao Online 1001
- ACM-ICPC 2019 山东省省赛D Game on a Graph
- 数学--数论--HDU6919 Senior PanⅡ【2017多校第九场】
- 数学--数论--Alice and Bob (CodeForces - 346A )推导
- ACM-ICPC 2019 山东省省赛 M Sekiro
- 数学--数论--HDU2136 Largest prime factor 线性筛法变形