Python socket实现多对多全双工通信的方法
服务器:#server.py
#!/usr/bin/envpython
#-*-coding:utf-8-*-
importsys
importstruct#将字符串打包为二进制流进行网络传输
importselect#
importsignal#用于捕获中断信号
importcPickle#将python对象进行序列化:dumps将python对象序列化保存为字符串,loads与之相反
fromsocketimport*
HOST=''
defsend(channel,*args):#发送数据
buffer=cPickle.dumps(args)
value=htonl(len(buffer))
size=struct.pack("L",value)
channel.send(size)
channel.send(buffer)
defreceive(channel):#接收数据
size=struct.calcsize("L")
size=channel.recv(size)
try:
size=ntohl(struct.unpack("L",size)[0])#socket.ntohl(参考:http://blog.csdn.net/tatun/article/details/7194973)
exceptstruct.error,e:
return''
buf=''
whilelen(buf)>'+data
foroutputinself.outputs:
ifoutput!=sock:
send(output,msg)
else:
self.clients-=1
sock.close()
inputs.remove(sock)
self.outputs.remove(sock)
msg='(Nowhungup:Clientfrom%s)'%self.get_client_name(sock)
message="Atpresent,onlyoneofyouisinthechatroom!"
foroutputinself.outputs:
send(output,msg)
ifself.clients==1:
send(self.outputs[0],message)
excepterror,e:
inputs.remove(sock)
self.outputs.remove(sock)
self.server.close()
if__name__=="__main__":
server=ChatServer(6004)
server.run()
客户端:#client.py
#!/usr/bin/envpython
#-*-coding:utf-8-*-
fromserverimportsend,receive
fromsocketimport*
importsys
importselect
importcPickle
importstruct
importsignal
classChatClient(object):
def__init__(self,name):
self.name=name
self.connected=False
self.host='localhost'
self.port=6004
try:
self.sock=socket(AF_INET,SOCK_STREAM)
self.sock.connect((self.host,self.port))
self.connected=True
send(self.sock,self.name)
data=receive(self.sock)
addr=data
excepterror,e:#socket.serro
print'Failedtoconnecttochatserver'
sys.exit(1)
defrun(self):
whileTrue:
try:
readable,writeable,exception=select.select([0,self.sock],[],[])
forsockinreadable:
ifsock==0:
data=sys.stdin.readline().strip()
ifdata:
send(self.sock,data)
else:
data=receive(self.sock)
ifnotdata:
print'Clientshuttingdown.'
self.connected=False
break
else:
sys.stdout.write(data+'\n')
sys.stdout.flush()
exceptKeyboardInterrupt:
print'Clientinterrupted'
self.sock.close()
break
if__name__=="__main__":
name=raw_input("Pleaseinputloginname>")
client=ChatClient(name)
client.run()
以上这篇Pythonsocket实现多对多全双工通信的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
热门推荐
6 保研的祝福语简短
10 年轻20岁祝福语简短
11 朋友结婚祝福语信息简短
12 女孩婚礼贺卡祝福语简短
13 30段点歌简短祝福语
14 虎年春节祝福语图文简短
15 写给后妈祝福语大全简短
16 简短回复生日祝福语
17 校长送毕业祝福语简短
18 毕业立体贺卡祝福语简短