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实现多对多全双工通信的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
热门推荐
10 祝女儿简短祝福语大全
11 大学新年祝福语简短创意
12 元旦适合的祝福语简短
13 朋友出远门祝福语简短
14 初六简短的祝福语
15 祝男孩生日祝福语简短
16 同事调离的祝福语简短
17 拜年红包的祝福语简短
18 妈妈生日祝福语简短励志