这是一个关于python的socket问题

service

import   socket
quest=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
quest.bind(('127.0.0.1',66))
quest.listen(2)
tao,en=quest.accept();

tao.send('hellow  成功'.encode())
a=tao.recv(100)
print(a.decode())
tao.close()
quest.close()

quest

import  socket
quest=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
quest.connect(('127.0.0.1',66))
quest.send(input().encode())
quest.recv(1000)
quest.close()

这是我写的两段代码,分别是客户端和服务器的。
我很奇怪一个事情,就是 我感觉 一方先send信息后,另外一方先recv信息才对 。因为程序是顺序执行的嘛。
可是我把两个代码send语句都放在recv语句之前,为啥还能成功呢

3个回答

两个程序无论谁快谁慢,都无所谓,因为recv会等待,但是send不会。
发送的数据会被放在缓冲区。

打一个比方,双方都给对方写信,然后去取对方的信。双方此时并不知道对方正在给自己写信(除非写了寄过来收到),也不需要等对方写了信,自己才能写。
双方都是写好信,然后再等在自己的信箱旁收对方的信。

qq_43412960
qq_43412960 谢谢
9 个月之前 回复

主要是send是非阻塞,发生之后不管对方是否接受都会执行下边的代码,发出的内容会在缓存中等待接受。而recv是阻塞,在没有收到信息时,会一直处于等待接受状态,知道接收到一天信息才会往下边执行。

qq_43412960
qq_43412960 谢谢
9 个月之前 回复

大概可以这么理解:
在tcp链接中,你先启动服务端,服务端需要绑定ip和端口,虽然你在服务端中send()消息给客户端,但是这个时候没有客户端链接到服务端,你的服务端
会在这句代码这里堵塞 tao,en=quest.accept();, 因为没有客户端链接,这里的accep()返回的是 新的客户端链接和客户端的ip和port,
所以服务端无法发送消息给客户端,当客户端链接到服务端的时候,会发送消息给服务端,这个时候服务端监听客户端,所以这个时候服务端就会通过tao,en=quest.accept()这句代码返回你启动的这个客户端链接,然后接下来就是按照顺序执行代码,发送消息给客户端,然后再接收消息,客户端这边也就会接受消息,最后都关闭链接。 代码的执行顺序你可以通过debug比较容易观察,如果有理解错误的地方请指出。

qq_43412960
qq_43412960 优秀
9 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问