python socket多线程并发,Python Socket多线程并发原理及实现

1.SocketServer模块编写的TCP服务器端代码

Socketserver原理图

8afecc8e2a84c64a88fecb8f86a7d8fc.png

服务端:

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()

以上就是Python Socket多线程并发原理及实现的详细内容,更多关于Python Socket多线程并发的资料请关注云海天教程其它相关文章!

原文链接:https://www.cnblogs.com/vipchenwei/p/7205872.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值