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)\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实现多对多全双工通信的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
python socket双向通信_Python socket实现多对多全双工通信的方法相关推荐
- python的socket编程_Python Socket编程详细介绍
在使用Python做socket编程时,由于需要使用阻塞(默认)的方式来读取数据流,此时对于数据的结束每次都需要自己处理,太麻烦.并且网上也没找到太好的封装,所以就自己写了个简单的封装. 封装思路 1 ...
- python socket 游戏_python socket模拟游戏开服
python socket服务端 #!/usr/bin/python #-*- coding: utf-8 -*- import socket import os,sys host='127.0.0. ...
- python的socket模块_Python socket模块方法实现详解
这篇文章主要介绍了python socket模块方法实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 socket ssh (不带防止粘包的方 ...
- python send 案例_python socket编程入门(编写server实例)+send 与sendall的区别与使用方法...
python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...
- python socket编程_Python Socket编程实现网络编程
对于有经验的开发人员来说,掌握的编程语言应该是不少的.在这些编程语言中,网络编程的应用时必不可少的.其中Python也是这样的编程语言.我们今天将会在这里为大家详细介绍一下Python Socket编 ...
- python socketio例子_Python socket.SocketIO方法代碼示例
本文整理匯總了Python中socket.SocketIO方法的典型用法代碼示例.如果您正苦於以下問題:Python socket.SocketIO方法的具體用法?Python socket.Sock ...
- python创建socket对象_python socket对象内建方法
服务器端套接字函数 s.bind() 绑定地址(主机,端口号对)到套接字 s.listen() 开始TCP 监听 s.accept() 被动接受TCP 客户的连接,(阻塞式)等待连接的到来 客户端套接 ...
- python加密库_python基于pyDes库实现des加密的方法
本文实例讲述了python基于pyDes库实现des加密的方法.分享给大家供大家参考,具体如下: 下载及简介地址:https://twhiteman.netfirms.com/des.html 如需要 ...
- python socks代理_Python中使用socks5设置全局代理的方法示例
0x01介绍 PySocks使您可以通过SOCKS和HTTP代理服务器发送流量.它是SocksiPy的现代分支,具有错误修复和其他功能. 0x02 安装 λ pip3 install Pysocks ...
最新文章
- GitLab+Jenkins+Ansible
- Java中FTPClient上传中文目录、中文文件名乱码问题解决方法
- Lesson 8.5 SOFTMAX回归
- php access ole相片,[求助]怎样读取ACCESS数据库中的OLE对象的图片啊???
- 河南科技大学828计算机网络,2017年河南科技大学信息工程学院828计算机网络之数据库系统概论考研导师圈点必考题汇编...
- for of 的用法区别_语法全解介词to和for的用法 如何简单区别使用
- 在 ubuntu 20.04 LTS 上安装 ROS2 执行 rosdep update 命令时出现的问题的解决办法
- 【NLP】10000亿参数!英伟达用3072块A100训出史上最大最贵GPT!
- css居中的几种方法_CSS几种常用的水平垂直居中对齐方法
- SQL Server 全文索引创建
- 炉石整活拔线方法_酒馆战棋:整活如何简单“拔线”?瓦娘在线教学,却3本得死神?...
- centos下MySQL Workbench连接时崩溃的解决方法
- 程序员降薪求职到底该不该?
- java注解 自定义策略传参_Java注解教程及自定义注解
- c语言贪吃蛇毕业论文,毕业论文c语言贪吃蛇
- 2022考研王道计算机408pdf(王道计算机组成原理+王道操作系统+王道计算机网络+王道数据结构)无水印
- u深度重装系统详细教程_u深度u盘装系统教程 u深度u盘装系统步骤
- LA4670 Dominating Patterns(AC自动机)
- 电动牙刷也有国产黑马,竟然比千元大牌还厉害 | 钛空实测
- c语言c 哪个好学,C语言好学吗?
热门文章
- Redis7实战加面试题-高阶篇(案例落地实战bitmap/hyperloglog/GEO)
- babel编译html文件,babel 和 browserify 编译
- Logitech K380 ⌨️ + iOS 14 常用快捷键指南
- 【转载3y】面试必考的:并发和并行有什么区别?
- qq引流能赚钱吗?QQ推广引流赚钱技巧
- android qmui简书,QMUI_Android/qmui_style_widget.xml at master · Tencent/QMUI_Android · GitHub
- android一个程序叫什么名字,1第一个Android应用程序
- SAS笔记(1) PDV与数据读入
- 无线智能门锁到底有没有必要联网?
- 自定义添加打印机纸张规格