c/s架构搭建
1.socket(套接字)
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
2.套接字有两种,分别是基于文件型的和基于网络型的。
基于文件类型的套接字家族:AF_UNIX AF_INET
3.套接字的工作流程
先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
4.基于TCP的套接字
服务端
ss = socket() #创建服务器套接字 ss.bind() #把地址绑定到套接字 ss.listen() #监听链接 inf_loop: #服务器无限循环 cs = ss.accept() #接受客户端链接 comm_loop: #通讯循环 cs.recv()/cs.send() #对话(接收与发送) cs.close() #关闭客户端套接字 ss.close() #关闭服务器套接字(可选)
客户端
cs = socket() # 创建客户套接字 cs.connect() # 尝试连接服务器 comm_loop: # 通讯循环 cs.send()/cs.recv() # 对话(发送/接收) cs.close() # 关闭客户套接字
下面模仿手机通讯来说明下套接字的流程
服务端
import socket #1、买手机 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp称为流式协议,udp称为数据报协议SOCK_DGRAM # print(phone) #2、插入/绑定手机卡 # phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) phone.bind(('127.0.0.1',8080)) # 绑定的里面放的是元组!元组!元组!!! #3、开机 phone.listen(5) # 半连接池,限制的是请求数 #4、等待电话连接 print('start....') while True: # 连接循环 conn,client_addr=phone.accept() #(三次握手建立的双向连接,(客户端的ip,端口)) # print(conn) print('已经有一个连接建立成功',client_addr) #5、通信:收\发消息 while True: # 通信循环 try: print('服务端正在收数据...') data=conn.recv(1024) #最大接收的字节数,没有数据会在原地一直等待收,即发送者发送的数据量必须>0bytes # print('===>') if len(data) == 0:break #在客户端单方面断开连接,服务端才会出现收空数据的情况 print('来自客户端的数据',data) conn.send(data.upper()) except ConnectionResetError: break #6、挂掉电话连接 conn.close() #7、关机 phone.close()
客户端
import socket #1、买手机 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # print(phone) #2、拨电话 phone.connect(('127.0.0.1',8080)) # 指定服务端ip和端口 #3、通信:发\收消息 while True: # 通信循环 msg=input('>>: ').strip() #msg='' if len(msg) == 0:continue phone.send(msg.encode('utf-8')) # print('has send----->') data=phone.recv(1024) # print('has recv----->') print(data) #4、关闭 phone.close()
越是困难的事越要立即去做,这样收益才会最大!!!