pythonsocket建立多用户通讯(Python socket实现多对多全双工通信的方法)
类别:脚本大全 浏览量:591
时间:2022-03-29 10:50:48 pythonsocket建立多用户通讯
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)\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回话列表 #elif sock == sys.stdin: #break else : try : data = receive(sock) if data: msg = '[' + self .get_client_name(sock) + '] >> ' + data for output in self .outputs: if output! = sock: send(output,msg) else : self .clients - = 1 sock.close() inputs.remove(sock) self .outputs.remove(sock) msg = '(Now hung up: Client from %s)' % self .get_client_name(sock) message = "At present, only one of you is in the chat room!" for output in self .outputs: send(output,msg) if self .clients = = 1 : send( self .outputs[ 0 ],message) except error,e: inputs.remove(sock) self .outputs.remove(sock) self .server.close() if __name__ = = "__main__" : server = ChatServer( 6004 ) server.run() |
客户端:#client.py
|
#!/usr/bin/env python #-*-coding:utf-8-*- from server import send,receive from socket import * import sys import select import cPickle import struct import signal class ChatClient( 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 except error,e: #socket.serro print 'Failed to connect to chat server' sys.exit( 1 ) def run( self ): while True : try : readable,writeable,exception = select.select([ 0 , self .sock],[],[]) for sock in readable: if sock = = 0 : data = sys.stdin.readline().strip() if data: send( self .sock,data) else : data = receive( self .sock) if not data: print 'Client shutting down.' self .connected = False break else : sys.stdout.write(data + '\n' ) sys.stdout.flush() except KeyboardInterrupt: print 'Client interrupted' self .sock.close() break if __name__ = = "__main__" : name = raw_input ( "Please input login name > " ) client = ChatClient(name) client.run() |
以上这篇Python socket实现多对多全双工通信的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持开心学习网。
原文链接:https://blog.csdn.net/zhidetian/article/details/53470849
您可能感兴趣
- python环境怎么安装pip(python2.7 安装pip的方法步骤管用)
- python怎么输出一个矩阵(python实现转圈打印矩阵)
- 多个图片拼接python实现(python实现两张图片的像素融合)
- 使用python编辑个人名片(python实现名片管理系统项目)
- python编写一个聊天机器人(不到20行代码用Python做一个智能聊天机器人)
- python教程第126节(Python 学习教程之networkx)
- python time模块是什么(python中时间模块的基本使用教程)
- python怎样读取txt文件的数据内容(Python实现读取txt文件中的数据并绘制出图形操作示例)
- 如何使用python定时运行(Python实现定时执行任务的三种方式简单示例)
- 使用python制作游戏(python制作填词游戏步骤详解)
- python获取系统的utc时间(Python的UTC时间转换讲解)
- knn算法详细步骤(Python实现KNNK-近邻算法的示例代码)
- python怎么装opencv(Python基于opencv实现的简单画板功能示例)
- python3列表的使用教程(对Python3 pyc 文件的使用详解)
- python 数据库实现学生管理系统(python+mysql实现教务管理系统)
- python编程ide工具(这6款Python IDE&代码编辑器,你都用过吗?)
- 越南新娘(越南新娘婚介网站)
- 越南新娘(越南新娘骗婚套路流程)
- 菲律宾游学(菲律宾游学中介机构)
- 菲律宾美食(菲律宾美食排行榜前十名)
- 菲律宾特产(菲律宾特产最值得买回国)
- 越南特产(越南特产首饰)
热门推荐
- html5显示中心代码(HTML5中的Web Notification桌面通知功能的实现方法)
- linux hadoop client 连接hbase(使用docker部署hbase的方法)
- 移动端touch事件
- react代码质量检查(react如何实现一个密码强度检测器详解)
- python 读文件报错处理(解决python写入带有中文的字符到文件错误的问题)
- docker正常容器启动失败(Docker容器无法停止删除的解决方案)
- php项目开发实例(php项目中类的自动加载实例讲解)
- mysql索引优化有哪些(MySQL如何基于Explain关键字优化索引功能)
- dede如何添加自定义字段内容(织梦dede模板标签书写格式的规范和相关注意事项)
- mysql查询条件的优化(MySQL查询优化之查询慢原因和解决技巧)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9