python socket多线程实现客户端与服务器连接
作者:上不了山的小非洲 发布时间:2021-09-06 15:44:01
标签:python,客户端,服务器
python socket多线程实现客户端与服务器连接,供大家参考,具体内容如下
之前因为一些作业需要完成一个服务器监听多个客户端的程序,于是就用python写了这样的程序。话不多说,直接上代码。
server代码:
import json
import socket
import threading
import time
import struct
class Server():
def __init__(self):
self.g_conn_pool = {} # 连接池
# 记录客户端数量
self.num =0
# 服务器本地地址
self.address = ('0.0.0.0', 8000)
# 初始化服务器
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_socket.bind(self.address)
self.server_socket.listen(128)
def accept_client(self):
"""
接收新连接
"""
while True:
client_socket, info = self.server_socket.accept() # 阻塞,等待客户端连接
print(client_socket,port)
# 给每个客户端创建一个独立的线程进行管理
thread = threading.Thread(target=self.recv_msg, args=(client_socket,info))
thread.setDaemon(True)
thread.start()
def recv_msg(self,client,info):
# 提示服务器开启成功
print('服务器已准备就绪!')
client.sendall("connect server successfully!".encode(encoding='utf8'))
# 持续接受客户端连接
while True:
try:
client.sendall(b'Success')
while True:
msg = client.recv(1024)
msg_recv = msg.decode('utf-8')
if not msg_recv:
continue
else:
recv_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print('客户端 ' + recv_time + ':\n')
print(' ' + msg_recv + '\n')
except Exception as e:
print('客户端断开连接...')
exit(-1)
break
def start_new_thread(self):
"""启动新线程来接收信息"""
thread = threading.Thread(target=self.accept_client, args=())
thread.setDaemon(True)
thread.start()
server服务器类,主要是监听以及接收客户端的信息。
#实例化一个Flask节点
app = Flask(__name__)
@app.route('/')
def hello():
return 'hello'
if __name__ == '__main__':
#创建解析器
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument('-p', '--port', default=5030, type=int, help='port to listen on')
args = parser.parse_args()
#获取端口号
port = args.port
#实例化一个server类 并启动
py_server = Server()
py_server.start_new_thread()
#启动Flask节点
app.run(host='127.0.0.1',port=port)
Client代码
class Client():
def __init__(self):
#服务器ip与端口
self.server_address = ('127.0.0.1', 8000)
self.num = 0
def recv_msg(self):
print("正在连接服务器....")
# 客户端连接服务器
while True:
try:
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#连接服务器
self.client_socket.connect(self.server_address)
num = self.num
# 制作报头
header_dic = {
'filename': num
}
header_bytes = json.dumps(header_dic).encode('utf-8')
self.client_socket.send(struct.pack('i', len(header_bytes)))
self.client_socket.send(header_bytes)
#接收信息
while True:
msg_recv = self.client_socket.recv(1024).decode('gbk')
print(msg_recv)
if msg_recv == 'Success':
print('客户端已与服务器成功建立连接...')
elif not msg_recv:
continue
else:
recv_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print( '服务器 ' + recv_time + ':\n')
print(' ' + msg_recv + '\n')
except:
print('与服务器断开连接...')
break
def start_new_thread(self):
"""启动新线程来接收信息"""
thread = threading.Thread(target=self.recv_msg, args=())
thread.setDaemon(True)
thread.start()
def main():
wf = Client()
wf.start_new_thread()
while True:
a = input()
wf.client_socket.send(a.encode('utf-8'))
if __name__ == '__main__':
main()
以上为客户端程序的代码。
下面是运行的结果:
服务器端:
多个客户端:
代码实现还是蛮容易的,具体可以自行修改使用。
来源:https://blog.csdn.net/weixin_43898483/article/details/110817406


猜你喜欢
- 前言命令模式,也称为动作或者事务模式,很多教材会用饭馆来举例。作为顾客的我们是命令的下达者,服务员是这个命令的接收者,菜单是这个实际的命令,
- URL 编码是什么东东呢?看看我从网上抄的定义: 引用: url编码是一种浏览器用来打包
- 前言地图定位这个功能大家都很熟悉吧,那微信小程序中要怎么实现地图定位呢,其实非常简单,没有大家想象中那么难,看完本篇文章,你也可以轻松实现这
- 01、Pandas在数据分析师的日常工作中,70%到80%都涉及到理解和清理数据,也就是数据探索和数据挖掘。Pandas主要用于数据分析,这
- 1.如果客户端和服务器端的连接需要跨越并通过不可信任的网络,那么就需要使用SSH隧道来加密该连接的通信。2.用set password语句来
- 怎样产生10个不同的随机数python产生10个不同随机数的方法:首先创建一个result的结果空列表;然后循环直到result的长度超过1
- asp之家注:如果你学习过asp,并且在网络公司上过班,一定会接触到网购系统,网购系统可以说是一个典型的程序类型,而其中最重要,也是最关键的
- CREATETABLE`users`(`id`int(10)NOTNULLAUTO_INCREMENT,`name`char(50)NOTN
- 本文实例讲述了Python PyQt5实现的简易计算器功能。分享给大家供大家参考,具体如下:这里剩下计算函数(self.calculator
- 一开始都是先去《英雄联盟》官网找到英雄及皮肤图片的网址:URL = r'https://lol.qq.com/data/info-h
- 本文主要介绍了Vue动态修改title的方法,需要的朋友可以参考学习,方法如下:1.通过自定义指令去修改(单个修改比较好)//1.在main
- 一、设置SQLServer身份验证1、按下windows+R,弹出运行框。2、在弹出框中输入cmd,按下enter键。3、在dos命令窗口输
- 一、Python sys 模块“sys” 是 “system&rdquo
- 本文实例讲述了python实现将pvr格式转换成pvr.ccz的方法。分享给大家供大家参考。具体实现方法如下:import zlibimpo
- 1、说明Python实现异步IO非常简单,asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。asyncio的
- XSL(EXtensible Stylesheet Language)它是指可扩展样式表语言。 XSL之于 XML 就像 CSS 之于 HT
- 可视化辅助函数在下面的代码的注释内有大致的操作基本操作与前面的人脸检测的操作相似,增加了可视化的辅助函数import matplotlib.
- 前言声明: 以下文章所包含的结论都是基于 typeScript@4.9.4 版本所取得的。extends 是 typeScript 中的关键
- 一般的django项目我都喜欢采用以下的文件结构,使用include的方式,实现从总的url分配给apps里面的urlExample:-pr
- centos7之Python3.74安装安装版本:Python3.74系统版本:centos7系统默认安装Python2.7,保留。安装/u