python socket select 一对多_Python socket实现多对多全双工通信的方法

#!/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)n"%(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回话列表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值