一、套接字发展史及分类
套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。 因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。
套接字家族:
文件类型的套接字家族的名字:AF_UNIX(unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信)
网络类型的套接字家族的名字:AF_INET(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)
最早的socket不是用来网络通信的, 是为了处理,同一台机器之上的两个进程之间互相的通信. - 原来的两个进程是不属于同一个内存空间,内存空间之间互相隔离.怎么解决这个问题呢? - 解决: 硬盘之间的数据是互相共享的,一个进程把数据写入到文件里面去,让另一个进程通过读取文件来达到数据之间的互相通信的目的.
二、套接字工作流程
import socket # 1、买手机 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议 # 2、绑定手机卡 phone.bind(('127.0.0.1',8083)) # 0-65535, 1024以前的都被系统保留使用 # 3、开机 phone.listen(5) # 5指的是半连接池的大小 print('服务端启动完成,监听地址为:%s:%s' %('127.0.0.1',8080)) # 4、等待电话连接请求:拿到电话连接conn conn,client_addr=phone.accept() # 5、通信:收\发消息 while True: try: data=conn.recv(1024) # 最大接收的数据量为1024Bytes,收到的是bytes类型 if len(data) == 0: # 在unix系统洗,一旦data收到的是空 # 意味着是一种异常的行为:客户度非法断开了链接 break print("客户端发来的消息:",data.decode('utf-8')) conn.send(data.upper()) except Exception: # 针对windows系统 break # 6、关闭电话连接conn(必选的回收资源的操作) conn.close() # 7、关机(可选操作) phone.close()
import socket #1、买手机 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议 #2、拨通服务端电话 phone.connect(('127.0.0.1',8083)) #3、通信 while True: msg=input("输入要发送的消息>>>: ").strip() #msg='' if len(msg) == 0:continue phone.send(msg.encode('utf-8')) print('======?') data=phone.recv(1024) print(data.decode('utf-8')) #4、关闭连接(必选的回收资源的操作) phone.close()