这个流程是在学习时,见到比较好理解的一种,比喻也很恰当。
服务端流程:
1.socket()创建一个套接字(在这里相当于创建一个电话)
2.把IP地址和端口号比喻成电话卡
3.bind()(将电话卡插进手机中)
4.listen(3) 监听电话,此时可以监听到三个电话,接到一个电话后,后面还能有两个电话给我打但是后面两个电话都要排队等着,等第一个电话挂掉。在来第四个的时候就会报错。
5.accept() 阻塞等待直到有人连接此时返回连接者的IP和port。
具体过程如下:
图片来源:TinyWebServer——从0到服务器开发! - 知乎 (zhihu.com)
import socket
#创建一个socket对象
server = socket.socket() #相当于创建了一部电话
ip_port = ('192.168.111.1',8001) #创建一个电话卡
server.bind(ip_port) #插上电话卡
server.listen(5) #监听着电话,我能监听5个,接到一个电话之后,后面还能有四个人给我打电话,但是后面这四个人都要排队等着,等着我第一个电话挂掉,再来第6个的时候,第六个人的手机会报错
print('11111')
#等着别人给我打电话,打来电话的时候,我就拿到了和对方的这个连线通道conn和对方的电话号码addr
conn,addr = server.accept() #阻塞住,一直等到有人连接我,连接之后得到一个元祖,里面是连线通道conn和对方的地址(ip+端口)
print('22222')
print(conn)
print('>>>>>>>>>',addr)
while True:
from_client_data = conn.recv(1024) #服务端必须通过两者之间的连接通道来收消息
from_client_data = from_client_data.decode('utf-8')
print(from_client_data)
if from_client_data == 'bye':
break
server_input = input('明威说>>>>:')
conn.send(server_input.encode('utf-8'))
if server_input == 'bye':
break
conn.close() #挂电话
server.close() #关手机
test_server.py