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
0
投稿
猜你喜欢
- 在MySQL4中,是已经开始支持全文检索(索引)的了。但是只是对英文支持全文检索。由于英文在书写上的特殊性,使得分词算法相对中文来说,简单得
- Web标准的web UI——来源、谬误与个人理解序我从2004年末开始接触web标准,2005年5月正式采取完全的web标准方式的网页制作,
- 一个小代码 类似资源管理器效果 支持鼠标拖拽 没写些细节东西 JavaScript语言:
- 终于完成了偶的拖动窗口,花了近15个小时,庆祝一下(*^__^*);以前写了IE下的功能,于是又写了firefox下的功能,在firefox
- 本文实例讲述了JS简单实现DIV相对于浏览器固定位置不变的方法。分享给大家供大家参考,具体如下:<!DOCTYPE HTML PUBL
- 前言requests是Python发送接口请求非常好用的一个三方库,由K神编写,简单,方便上手快。但是requests发送请求是串行的,即阻
- (一)ts文件下载网页文件下载其实都可以通过requests.get以文件流的形式获取,并以字节的形式写入本地文件即可。代码如下:impor
- 疫情数据程序源码// An highlighted blockimport requestsimport jsonclass epidemi
- 超链接在新窗口打开,是在<a>标签加 target="_blank" 即可。可按下“POST/GET提交按钮
- 如下所示:#待处理列表A= [1,2,3,4,5]#移动次数a = 3右移比较简单for i in range(a): A.insert(0
- 简介看到了一个能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息的模块–psutil模块。这次利用psutil
- 题目大意问 太阳神有一牛群,由白、黑、花、棕四种颜色的公、母牛组成,其间关系如下,求每种牛的个数。公牛中,白牛多于棕牛,二者之差为
- 最近听了张江老师的深度学习课程,用Pytorch实现神经网络预测,之前做Titanic生存率预测的时候稍微了解过Tensorflow,听说T
- 本文实例讲述了Python图像处理之直线和曲线的拟合与绘制。分享给大家供大家参考,具体如下:在数据处理和绘图中,我们通常会遇到直线或曲线的拟
- golang的单引号转义如题,golang中有时候需要将一个字符串中的单引号再转义一次,比如在两个单引号之间包含一个含有单引号的字符串的情形
- 最近碰到一个mysql5数据库的问题。就是一个标准的servlet/tomcat网络应用,后台使用mysql数据库。问题是待机一晚上后,第二
- 以前在工作中遇到一个问题,当表单发送的数据量很大时,就会报错。查阅MSDN了解到,原因是微软对用Request.Form()可接收的最大数据
- 多级联动下拉选择框,动态获取下一级,每一级数据为XML,可支持无限级(浏览器端需要Microsoft.XMLDOM支持)项目需要,一个材料类
- 导言DataList的编辑界面由EditItemTemplate里的标记语言和web控件定义。在目前为止所做的DataList编辑功能的例子
- 每次查询分析器寻找路径时,并不会每一次都去统计索引中包含的行数,值的范围等,而是根据一定条件创建和更新这些信息后保存到数据库中,这也就是所谓