python单线程下实现多个socket并发过程详解
先看服务端的代码
importsys
#importsocket
importtime
importgevent
fromgeventimportsocket
fromgeventimportmonkey
monkey.patch_all()
#类似于python中的黑魔法,把很多模块的阻塞的变成非阻塞的,比如socket中的rece和send都变
#为不阻塞了
defserver(port):
s=socket.socket()
s.bind(("127.0.0.1",port))
s.listen(2000)
whileTrue:
cli,add=s.accept()
gevent.spawn(handle_request,cli)
#通过gevent的启动一个协程,把客户端的socket对象传进去
defhandle_request(s):
try:
whileTrue:
data=s.recv(1024)
print("收到的信息:",str(data,encoding="utf-8"))
s.send(data)
ifnotdata:
s.shutdown(socket.SHUT_WR)
#把和客户端这个链接销毁
exceptExceptionasex:
print(ex)
finally:
s.close()
if__name__=='__main__':
server(8000)
在看客户端的代码,分别使用多线程和多进程实现
importsocket
importgevent
importthreading
importmultiprocessing
'''
ip_bind=("127.0.0.1",8000)
c=socket.socket()
c.connect(ip_bind)
whileTrue:
data=input("客户端:")
c.send(bytes(data,encoding="utf-8"))
data=c.recv(1024)
print("服务端:",str(data,encoding="utf-8"))
c.close()
'''
importsocket
importgevent
ip_bind=("127.0.0.1",8000)
c=socket.socket()
c.connect(ip_bind)
deff(n):
whileTrue:
#c.send(bytes(n,encoding="utf-8"))
data=str(n)
c.send(bytes(data,encoding="utf-8"))
data=c.recv(1024)
print("server:",str(data,encoding="utf-8"))
c.close()
x=[]
if__name__=='__main__':
l=[]
"""
多线程实现并发客户端
foriinrange(500):
t=threading.Thread(target=f,args=[str(i),])
t.start()
l.append(t)
fortinl:
t.join()
"""
#多进程实现并发客户端
foriinrange(100):
p=multiprocessing.Process(target=f,args=[i,])
p.start()
l.append(p)
forpinl:
p.join()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。