Python TCPServer 多线程多客户端通信的实现
作者:东南飘雪 发布时间:2021-07-05 22:33:00
标签:Python,TCPServer,通信
最简单、原始的TCP通信demo
服务端Http请求:
import socket
# 创建一个servicesocke
serviceSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 给服务器绑定地址(ip地址,端口号)
serviceSocket.bind(("192.168.171.1", 80))
print("等待客户端接入")
# sock 是客户端的socket信息
# addr 是客户端的地址(ip,端口)
sock, addr = serviceSocket.accept()
print(f"sock from client:{sock}")
print(f"addr of client:{addr}")
while True:
# 接收客户端的请求
recvData = sock.recv(1024)
print("客户端说:%s" % (recvData.decode("utf-8")))
sendData = input("服务器说:")
# 发送(回复)数据给客户端
sock.send(sendData.encode("utf-8"))
客户端Http请求:
import socket
# 创建客户端socket
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
clientSocket.connect(("192.168.171.1", 80))
while True:
# 发送消息给服务器
sendData = input("客户端说:")
if sendData == "bye":
clientSocket.send(sendData.encode("utf-8")) # 编码:将数据装换成二进制形式
break
clientSocket.send(sendData.encode("utf-8"))
recvData = clientSocket.recv(1024)
print("服务器说:%s" % (recvData.decode("utf-8"))) # 解码:将二进制转换成字符
1、在TCP中,客户端的实现流程:
创建客户端的socket对象建立与服务器之间的联系发送请求接收数据关闭连接
2、服务端的实现流程:
创建服务端的socket对象绑定服务端的地址设置 * 等待客户端的连接接收客户端的请求返回处理的结果到客户端
ThreadingTCPServer 多线程多客户端通信自动重连demo
socketserver继承图:
TCPServer
# from socketserver import TCPServer, BaseRequestHandler, ThreadingTCPServer
from socketserver import TCPServer, StreamRequestHandler, ThreadingMixIn
import traceback
# class MyBaseRequestHandler(BaseRequestHandler):
class MyBaseRequestHandler(StreamRequestHandler):
def handle(self):
self.addr = self.request.getpeername()
self.server.users[self.addr[1]] = self.request
message = "IP " + self.addr[0] + ":" + str(self.addr[1]) + " Connected..."
print(message)
while True:
try:
data = self.request.recv(1024).decode('UTF-8', 'ignore').strip()
print(f'receive from {self.client_address}:{data}')
back_data = (f"response\"" + data + "\":\n").encode("utf8")
self.request.sendall(back_data)
except:
traceback.print_exc()
break
# 源码:class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
# 从ThreadingMixIn和TCPServer继承,实现多线程
class MyThreadingTCPServer(ThreadingMixIn, TCPServer):
def __init__(self, server_address, RequestHandlerClass):
TCPServer.__init__(self, server_address, RequestHandlerClass)
self.users = {}
class MyTCPserver():
def __init__(self, server_addr='192.168.1.109', server_port=23):
self.server_address = server_addr
self.server_port = server_port
self.server_tuple = (self.server_address, self.server_port)
def run(self):
# server = TCPServer(self.server_tuple, MyBaseRequestHandler)
server = MyThreadingTCPServer(self.server_tuple, MyBaseRequestHandler)
server.serve_forever()
if __name__ == '__main__':
myserver = MyTCPserver()
myserver.run()
在telnet 下开启开启两个客户端,本电脑的IP为192.168.1.109,开两个客户端后,TCPServer的终端出现同一个IP但是不同端口的连接:
TCPClient
import socket
import time
class MyClient:
host = '192.168.1.109'
port = 23
bufsiz = 1024
addr = None
skt = None
def __init__(self, host=None, port=None):
if host != None:
self.host = host
if port != None:
self.port = port
if self.addr == None:
self.addr = (self.host, self.port)
self.doConnection()
def doConnection(self):
try:
self.skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.skt.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
print(self.addr)
self.skt.connect(self.addr)
except:
pass
def run(self):
while True:
try:
_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
self.skt.sendall(f'{_time}:i am clent1 '.encode('utf-8'))
data = self.skt.recv(self.bufsiz)
print(data.decode('utf-8', 'ignore'))
if not data:
break
print(data.strip())
time.sleep(5)
except socket.error:
print('socket error, reconnection') # 自动重连
time.sleep(3)
self.doConnection()
except:
print('other error')
self.skt.close()
myclient = MyClient()
myclient.run()
上面用的是telnet工具来作为客户端,这里是用代码实现模拟的客户端。
来源:https://blog.csdn.net/qq_31362767/article/details/103758119
0
投稿
猜你喜欢
- 说到Javascript的类继承,就必然离不开原型链,但只通过原型链实现的继承有着不少缺陷。无参数类继承的问题先看一段示例代码,实现B继承于
- 本文实例讲述了Python基于pillow判断图片完整性的方法。分享给大家供大家参考,具体如下:1、安装第三方库。pip install p
- 本文由伯乐在线 - 敏捷翻译的史莉萍翻译自《Creating an Effective Color-Scheme for Web Desig
- 这篇文章主要介绍了postman和python mock测试过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- ModuleNotFoundError: No module named ‘dlib'尝试命令,但没成功pip3 install d
- 毫无疑问,Google是当今世界上最成功的互联网公司之一,但是Google也曾推出过一些失败的实验品。还记得Google Accelerat
- 在cssplay网站看到有一组CSS像素画,于是也想摩仿一下,于是在网络上找到一组头像图标,看其结构比较简单,就拿它开刀吧!先看看预览图图一
- 字符串转十六进制StrToHex Function<% Response.Write StrToHex("Nice
- sort包简介官方文档Golang的sort包用来排序,二分查找等操作。本文主要介绍sort包里常用的函数,通过实例代码来快速学会使用sor
- 本文实例为大家分享了python实现年会抽奖程序的具体代码,供大家参考,具体内容如下发一下自己写的公司抽奖程序。需求:公司年会要一个抽奖程序
- 在我们平时的开发过程中,为了方便调试程序,我们都是打开开发者模式,即Debug=True,当我们正式上线的时候肯定就需要把开发者模式关掉,用
- 任何使用yield的函数都称之为生成器,如:def count(n): while n > 0: &nb
- 1、subprocess这个模块来产生子进程,并且可以连接到子进程的标准输入、输出、错误中,还可以获得子进程的返回值。2、subproces
- 本文实例讲述了JS实现淘宝支付宝网站的控制台菜单效果。分享给大家供大家参考。具体如下:这是一款支付宝网站中的控制台总菜单,可实现动画效果的显
- 光线追迹得益于计算机的计算的能力,通过追踪具有代表性的光线的传播轨迹,可以更加精确地描述光学系统的性能,光线追迹方法也因此大展其能,诸如Ze
- 阅读上一章:chapter 5 表单Chapter 6 <strong>,<em>与其他短语元素在引言和前面的章节中
- 包括安装时提示有挂起的操作、收缩数据库、压缩数据库、转移数据库给新用户以已存在用户权限、检查备份集、修复数据库等。 (一)挂起操作在安装S
- 本文实例讲述了Python按行读取文件的实现方法。分享给大家供大家参考,具体如下:小文件:#coding=utf-8#author: wal
- 为index.php文件设置只读属性后,木马就没权限给你文件末尾追加广告了。下面我们看具体的代码,设置index.php只读:<?ph
- 一个网站空间,但是却可以实现多个域名的访问的一段ASP代码:<%if Request.ServerVariables("SE