没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Python socket实现多对多全双工通信的方法实现多对多全双工通信的方法
今天小编就为大家分享一篇Python socket实现多对多全双工通信的方法,具有很好的参考价值,希望对大家有所帮助。
一起跟随小编过来看看吧
服务器:服务器:#server.py
#!/usr/bin/env python
#-*-coding:utf-8-*-
import sys
import struct#将字符串打包为二进制流进行网络传输
import select#
import signal#用于捕获中断信号
import cPickle#将python对象进行序列化:dumps将python对象序列化保存为字符串,loads与之相反
from socket import *
HOST = ''
def send(channel,*args):#发送数据
buffer = cPickle.dumps(args)
value = htonl(len(buffer))
size = struct.pack("L",value)
channel.send(size)
channel.send(buffer)
def receive(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)
except struct.error,e:
return ''
buf = ''
while len(buf) < size:
buf += channel.recv(size-len(buf))
return cPickle.loads(buf)[0]#恢复python对象
class ChatServer(object):
def __init__(self,PORT,backlog = 5):
self.clients = 0
self.clientmap = {}
self.outputs = [] #Client会话列表
self.server = socket(AF_INET, SOCK_STREAM)
self.server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)#重用套接字地址
self.server.bind((HOST,PORT))
self.server.listen(backlog)
signal.signal(signal.SIGINT,self.signalhandler)#使用signal模块捕获中断操作 SIGINT中断进程(ctrl+c), SIGTERM 终止进程,SIGKILL杀死进程,SIGALRM 闹钟信号
def signalhandler(self,signum,frame):#中断处理方法
print "Shutting down server ..."
for output in self.outputs:
output.close()
self.server.close()
def get_client_name(self,client):
info = self.clientmap[client]
host,port,name = info[0][0],info[0][1],info[1]
return ':'.join((('@'.join((name,host))),str(port)))
def run(self):
inputs = [self.server]
print 'Waiting for connect...'
while True:
try:
readable,writeable,execption = select.select(inputs,self.outputs,[])
except select.error,e:
break
for sock in readable:
if sock == self.server:#服务器端接收
client,address = self.server.accept()
print "Chat server: connected from",address
self.clients += 1
cname = receive(client)
send(client,str(address[0]))
inputs.append(client)
self.clientmap[client] = (address,cname)
msg = "(Connected : New Client(%d) from %s)"%(self.clients,self.get_client_name(client))
message = "At present, only one of you is in the chat room!"
if self.clients == 1:
send(client,message)
for output in self.outputs:
send(output,msg)
self.outputs.append(client)#将开始回话的client加入Client回话列表
#elif sock == sys.stdin:
#break
else:
try:
资源评论
weixin_38577378
- 粉丝: 4
- 资源: 894
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功