Python 基础之socket编程(一)
可以进行通信玩儿了,感觉不错不错,网络通信就像打电话,我说一句你听一句之后,你再说一句,我听一句,就这样。。。。。下去了。不扯淡了,来来来,看看今天都搞了点啥东西。
一、 客户端与服务器架构
即C/S架构,包括
1.硬件C/S架构(打印机)
2.软件C/S架构(web服务)
二、Socket 是何鬼?
简单来说Socket就是用来完成客户端与服务器之间的通信
例如浏览器访问网页,例如网络游戏等一切基于客户端服务器来实现的C/S架构程序
Socket是基于互联网OSI七层协议的一个结构,准确的说是基于建议互联网模型OSI五层协议的接口
此处延伸一个概念:套接字
套接字在最开始的时候,是应用于进程与进程之间的通信,之后被广泛应用到互联网,基本上分为两个种族
基于文件类型的套接字:AF_UNIX
基于网络类型的套接字:AF_INET
而对于我们来说重点肯定是网络类型,so今后我们会对AF_INET分解研究
套接字的工作流程:
接下来说一下socket通信时用的一些方法:
这里我们可以看出来socket的基本工作流程了,也大致看了一下socket通信时所用到的方法
服务端套接字函数
服务端套接字函数
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来
客户端套接字函数
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
公共用途的套接字函数
s.recv() 接收TCP数据
s.send() 发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() 发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字
面向锁的套接字方法
s.setblocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间
面向文件的套接字的函数
s.fileno() 套接字的文件描述符
s.makefile() 创建一个与该套接字相关的文件
到底socket是如何进行通信的呢?来来来,看两个例子先:
1.简单版的c/s通信
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 买手机 phone.connect(('127.0.0.1',8080)) # 拨通电话 phone.send('hello'.encode('utf-8')) # 发消息 data=phone.recv(1024) print('收到服务端的发来的消息:',data)