Python Socket多线程并发原理及实现
作者:看雪。 时间:2022-09-05 08:21:07
1.SocketServer模块编写的TCP服务器端代码
Socketserver原理图
服务端:
import SocketServer #导入SocketServer,多线程并发由此类实现
class MySockServer(SocketServer.BaseRequestHandler): #定义一个类
def handle(self): #handle(self)方法是必须要定义的,可以看上面的说明
print 'Got a new connection from', self.client_address
while True:
data = self.request.recv(1024) #需要通过self的方法调用数据接收函数
if not data:break
print 'recv:', data
self.request.send(data.upper()) #需要通过self的方法调用数据接收函数
if __name__ == '__main__': #并非一定要用这样的方式,只是建议这样使用
HOST = '' #定义侦听本地地址口(多个IP地址情况下),这里表示侦听所有
PORT = 50007 #Server端开放的服务端口
s = SocketServer.ThreadingTCPServer((HOST, PORT), MySockServer)
#调用SocketServer模块的多线程并发函数
s.serve_forever() #持续接受客户端的连接
客户端:
import socket
HOST = '192.168.1.13'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
user_input = raw_input('msg to send:').strip()
s.sendall(user_input)
data = s.recv(1024)
print 'Received', repr(data)
s.close()
2.基于Python Socketserver的实现的FTP程序
服务端:
import socketserver
import struct
import json
import os
class FtpServer(socketserver.BaseRequestHandler):
coding='utf-8'
server_dir='file_upload'
max_packet_size=1024
BASE_DIR=os.path.dirname(os.path.abspath(__file__))
def handle(self):
print(self.request)
while True:
data=self.request.recv(4)
data_len=struct.unpack('i',data)[0]
head_json=self.request.recv(data_len).decode(self.coding)
head_dic=json.loads(head_json)
# print(head_dic)
cmd=head_dic['cmd']
if hasattr(self,cmd):
func=getattr(self,cmd)
func(head_dic)
def put(self,args):
file_path = os.path.normpath(os.path.join(
self.BASE_DIR,
self.server_dir,
args['filename']
))
filesize = args['filesize']
recv_size = 0
print('----->', file_path)
with open(file_path, 'wb') as f:
while recv_size < filesize:
recv_data = self.request.recv(self.max_packet_size)
f.write(recv_data)
recv_size += len(recv_data)
print('recvsize:%s filesize:%s' % (recv_size, filesize))
ftpserver=socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer)
ftpserver.serve_forever()
客户端:
import socket
import struct
import json
import os
class MYTCPClient:
address_family = socket.AF_INET
socket_type = socket.SOCK_STREAM
allow_reuse_address = False
max_packet_size = 8192
coding='utf-8'
request_queue_size = 5
def __init__(self, server_address, connect=True):
self.server_address=server_address
self.socket = socket.socket(self.address_family,
self.socket_type)
if connect:
try:
self.client_connect()
except:
self.client_close()
raise
def client_connect(self):
self.socket.connect(self.server_address)
def client_close(self):
self.socket.close()
def run(self):
while True:
inp=input(">>: ").strip()
if not inp:continue
l=inp.split()
cmd=l[0]
if hasattr(self,cmd):
func=getattr(self,cmd)
func(l)
def put(self,args):
cmd=args[0]
filename=args[1]
if not os.path.isfile(filename):
print('file:%s is not exists' %filename)
return
else:
filesize=os.path.getsize(filename)
head_dic={'cmd':cmd,'filename':os.path.basename(filename),'filesize':filesize}
print(head_dic)
head_json=json.dumps(head_dic)
head_json_bytes=bytes(head_json,encoding=self.coding)
head_struct=struct.pack('i',len(head_json_bytes))
self.socket.send(head_struct)
self.socket.send(head_json_bytes)
send_size=0
with open(filename,'rb') as f:
for line in f:
self.socket.send(line)
send_size+=len(line)
print(send_size)
else:
print('upload successful')
client=MYTCPClient(('127.0.0.1',8080))
client.run()
来源:https://www.cnblogs.com/vipchenwei/p/7205872.html
标签:Python,Socket,多线程,并发
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
sqlserver 快速生成汉字的首拼字母的函数(经典)
2012-06-06 20:16:41
asp 存储过程分页代码第1/2页
2011-04-03 10:39:00
![](https://img.aspxhome.com/file/UploadPic/20112/5/201125112228776s.jpg)
php文件类型MIME对照表(比较全)
2023-06-08 07:24:10
python 如何在测试中使用 Mock
2022-01-08 07:41:09
opencv python在视屏上截图功能的实现
2021-04-14 04:00:30
![](https://img.aspxhome.com/file/2023/5/63575_0s.jpg)
有时用户并不需要引导
2009-07-17 18:48:00
![](https://img.aspxhome.com/file/UploadPic/20097/17/ceshi-96s.png)
使用Python写一个贪吃蛇游戏实例代码
2023-07-05 18:25:02
Python实现常见的4种坐标互相转换
2023-11-21 06:22:38
![](https://img.aspxhome.com/file/2023/0/63200_0s.png)
Python线程之如何解决共享变量问题
2023-08-27 16:15:56
![](https://img.aspxhome.com/file/2023/0/70700_0s.png)
Ajax发明人:Ajax并不适合所有网站
2008-01-30 12:20:00
pandas pd.read_csv()函数中parse_dates()参数的用法说明
2023-07-22 04:51:26
![](https://img.aspxhome.com/file/2023/8/63978_0s.jpg)
sqlserver bcp(数据导入导出工具)一般用法与命令详解
2012-07-11 15:56:39
django从请求到响应的过程深入讲解
2021-08-09 19:41:06
![](https://img.aspxhome.com/file/2023/8/72868_0s.png)
VML模拟Rose画流程图代码
2008-09-02 10:58:00
![](https://img.aspxhome.com/file/UploadPic/20089/2/vml_rose_33s.gif)
JavaScript获取事件对象的注意点
2009-07-29 18:36:00
PHP中array_slice函数用法实例详解
2023-06-20 20:18:04
Windows下将Python文件打包成.EXE可执行文件的方法
2021-08-04 02:47:59
JS实现数字格式千分位相互转换方法
2023-08-31 08:24:48
关于SQL Server中索引使用及维护简介
2008-12-24 15:39:00
用asp实现读取文件的最后一行的代码
2011-03-08 10:55:00