1 服务器 客户端架构 C/S架构
server端要求:
1 2
| 1.力求一直提供服务 2. 绑定一个地址,客户能够一直找到
|
2 OSI七层
1 2 3
| 数据链路层是 以太网协议 IP是通过子网查找 ARP协议 Mac地址 TCP/UDP 是传输层 找对应的端口
|

3 SOCKET层
socket是把TCP/协议隐藏在Scocket后面

4 socket工作流程
先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束

打电话模拟socket通信
服务端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) phone.bind(('127.0.0.1', 8888)) phone.listen(5) print('server is starting...') while True: conn, addr = phone.accept() print("电话线路" , conn) print("手机的地址" , addr) while True: try: data = conn.recv(1024) if not data: continue print("客户发来消息%s" % data) conn.send(data) except Exception as e: break conn.close() phone.close() ''' server is starting... 电话线路 <socket.socket fd=288, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8888), raddr=('127.0.0.1', 1676)> 手机的地址 ('127.0.0.1', 1676) 客户发来消息b'hello' 客户发来消息b'world' '''
|
客户端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) phone.connect(('127.0.0.1', 8888)) while True: msg = input(">>>:").strip() if not msg: continue phone.send(msg.encode('utf-8')) data = phone.recv(1024) print(data) phone.close() ''' >>>:hello b'hello' >>>:world b'world' >>>: '''
|