python---基础知识回顾(十)进程和线程(自定义线程池)
一:Socket
(一)套接字了解
网络套接字,用于描述IP地址和端口,是一个通信链句柄,一般,应用程序通过对这个句柄进行读写操作,可以对网络发出或者应答网络请求。也是一种特殊的文件(起源Unix,一切皆是文件)
socket主要支持两种类型的套接字,流套接字和数据报套接字。(其实还有其他的)
SOCK_STREAM :流套接字(TCP)提供了双向有序且不重复的数据服务。
SOCK_DGRAM:数据报套接字(UDP)虽然支持双向的数据流,但是对报文的有序性和可靠性不保证。
套接字家族也主要使用两种,基于文件和基于网络类型的套接字家族
基于文件类型的套接字家族:AF_UNIX
调用的就是底层的文件系统来取数据,两个套接字进程运行在统一机器,可以通过访问同一个文件系统间接完成通信
基于网络类型的套接字家族:AF_INET
所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET
(二)socket工作方式(TCP)
套接字在工作时将连接的双方分为服务器端和客户端,C/S模式的由来。
import socket ip_port = ('127.0.0.1',8080) #用于绑定本机地址和端口 sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #里面的参数是默认的,可以不写 sk.bind(ip_port) #绑定连接地址和端口 sk.listen(5) #设置监听数量 while True: print("Server waiting...") conn,addr = sk.accept() #返回客户端套接字和地址 print("Connect from",addr) client_data = conn.recv(1024) #从客户端套接字中读取1024字节数据 print("Recv:%s"%client_data.decode("utf-8")) conn.sendall("接收到你的数据".encode("utf-8")) conn.close() #关闭客户端套接字的连接 sk.close()