什么是socket
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,socket起源于Unix,而Unix/liunx基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read – 关闭close”模式 来操作。Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)
socket 的常用方法
family(socket家族)
socket.AF_UNIX:用于本机进程间通讯,为了保证程序安全,两个独立的程序(进程)间是不能互相访问彼此的内存的,但为了实现进程间的通讯,可以通过创建一个本地的socket来完成
socket.AF_INET:(还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)
socket type类型
socket.SOCK_STREAM #for tcp
socket.SOCK_DGRAM #for udp
socket.SOCK_RAW #原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
socket.SOCK_RDM #是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
socket.SOCK_SEQPACKET
常用方法
socket.socket():建立socker套接字,两个参数,family代表家族.type代表类型,type默认TCP
socket.bind():服务器端,接受的参数是元组,不是传递host,port两个元素,而是(host,port)
socket.listen():一个参数,值为允许客户端连接服务器的排队上线,如果超过挂起上限则会拒绝掉
socket.accept():无参数,其返回值是一个元组,第一个是新的套接字对象,第二个是地址
clnt.recv(1024):参数内设置为一次接收的数据,即字节
s.send() 发送数据
socket.connect():客户端,与bind对应,接受的也是元组
s.close() 关闭套接字
socket 的通信原理图
示列演示:
服务端
import socket # 生成一个socket 对象连接 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # bind 监听地址 server.bind((‘127.0.0.1‘, 8000)) # 启动监听 print("启动监听状态........") server.listen(5) # 等待连接 conn, addr = server.accept() data = conn.recv(1024) print("从客户端接收的数据", data) conn.send(data.upper()) # 发送数据给客户端 conn.close() server.close()
客户端
import socket client = socket.socket() client.connect(("127.0.0.1", 8000)) client.send("hello python ,i am socket".encode("utf-8")) data = client.recv(1024) print("从服务端接收的数据", data) client.close()
运行顺序
运行服务端、运行客户端
服务端,显示客户端,发送的数据
客户端显示 ,服务端发送的数据
原文地址:https://www.cnblogs.com/brave1/p/9833782.html