服务器:#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实现多对多全双工通信的方法相关推荐

  1. python的socket编程_Python Socket编程详细介绍

    在使用Python做socket编程时,由于需要使用阻塞(默认)的方式来读取数据流,此时对于数据的结束每次都需要自己处理,太麻烦.并且网上也没找到太好的封装,所以就自己写了个简单的封装. 封装思路 1 ...

  2. python socket 游戏_python socket模拟游戏开服

    python socket服务端 #!/usr/bin/python #-*- coding: utf-8 -*- import socket import os,sys host='127.0.0. ...

  3. python的socket模块_Python socket模块方法实现详解

    这篇文章主要介绍了python socket模块方法实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 socket ssh (不带防止粘包的方 ...

  4. python send 案例_python socket编程入门(编写server实例)+send 与sendall的区别与使用方法...

    python 编写server的步骤: 1. 第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参 ...

  5. python socket编程_Python Socket编程实现网络编程

    对于有经验的开发人员来说,掌握的编程语言应该是不少的.在这些编程语言中,网络编程的应用时必不可少的.其中Python也是这样的编程语言.我们今天将会在这里为大家详细介绍一下Python Socket编 ...

  6. python socketio例子_Python socket.SocketIO方法代碼示例

    本文整理匯總了Python中socket.SocketIO方法的典型用法代碼示例.如果您正苦於以下問題:Python socket.SocketIO方法的具體用法?Python socket.Sock ...

  7. python创建socket对象_python socket对象内建方法

    服务器端套接字函数 s.bind() 绑定地址(主机,端口号对)到套接字 s.listen() 开始TCP 监听 s.accept() 被动接受TCP 客户的连接,(阻塞式)等待连接的到来 客户端套接 ...

  8. python加密库_python基于pyDes库实现des加密的方法

    本文实例讲述了python基于pyDes库实现des加密的方法.分享给大家供大家参考,具体如下: 下载及简介地址:https://twhiteman.netfirms.com/des.html 如需要 ...

  9. python socks代理_Python中使用socks5设置全局代理的方法示例

    0x01介绍 PySocks使您可以通过SOCKS和HTTP代理服务器发送流量.它是SocksiPy的现代分支,具有错误修复和其他功能. 0x02 安装 λ pip3 install Pysocks ...

最新文章

  1. GitLab+Jenkins+Ansible
  2. Java中FTPClient上传中文目录、中文文件名乱码问题解决方法
  3. Lesson 8.5 SOFTMAX回归
  4. php access ole相片,[求助]怎样读取ACCESS数据库中的OLE对象的图片啊???
  5. 河南科技大学828计算机网络,2017年河南科技大学信息工程学院828计算机网络之数据库系统概论考研导师圈点必考题汇编...
  6. for of 的用法区别_语法全解介词to和for的用法 如何简单区别使用
  7. 在 ubuntu 20.04 LTS 上安装 ROS2 执行 rosdep update 命令时出现的问题的解决办法
  8. 【NLP】10000亿参数!英伟达用3072块A100训出史上最大最贵GPT!
  9. css居中的几种方法_CSS几种常用的水平垂直居中对齐方法
  10. SQL Server 全文索引创建
  11. 炉石整活拔线方法_酒馆战棋:整活如何简单“拔线”?瓦娘在线教学,却3本得死神?...
  12. centos下MySQL Workbench连接时崩溃的解决方法
  13. 程序员降薪求职到底该不该?
  14. java注解 自定义策略传参_Java注解教程及自定义注解
  15. c语言贪吃蛇毕业论文,毕业论文c语言贪吃蛇
  16. 2022考研王道计算机408pdf(王道计算机组成原理+王道操作系统+王道计算机网络+王道数据结构)无水印
  17. u深度重装系统详细教程_u深度u盘装系统教程 u深度u盘装系统步骤
  18. LA4670 Dominating Patterns(AC自动机)
  19. 电动牙刷也有国产黑马,竟然比千元大牌还厉害 | 钛空实测
  20. c语言c 哪个好学,C语言好学吗?

热门文章

  1. Redis7实战加面试题-高阶篇(案例落地实战bitmap/hyperloglog/GEO)
  2. babel编译html文件,babel 和 browserify 编译
  3. Logitech K380 ⌨️ + iOS 14 常用快捷键指南
  4. 【转载3y】面试必考的:并发和并行有什么区别?
  5. qq引流能赚钱吗?QQ推广引流赚钱技巧
  6. android qmui简书,QMUI_Android/qmui_style_widget.xml at master · Tencent/QMUI_Android · GitHub
  7. android一个程序叫什么名字,1第一个Android应用程序
  8. SAS笔记(1) PDV与数据读入
  9. 无线智能门锁到底有没有必要联网?
  10. 自定义添加打印机纸张规格