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

作者:看雪。 时间:2022-09-05 08:21:07 

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

Socketserver原理图

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

服务端:


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,多线程,并发
0
投稿

猜你喜欢

  • sqlserver 快速生成汉字的首拼字母的函数(经典)

    2012-06-06 20:16:41
  • asp 存储过程分页代码第1/2页

    2011-04-03 10:39:00
  • php文件类型MIME对照表(比较全)

    2023-06-08 07:24:10
  • python 如何在测试中使用 Mock

    2022-01-08 07:41:09
  • opencv python在视屏上截图功能的实现

    2021-04-14 04:00:30
  • 有时用户并不需要引导

    2009-07-17 18:48:00
  • 使用Python写一个贪吃蛇游戏实例代码

    2023-07-05 18:25:02
  • Python实现常见的4种坐标互相转换

    2023-11-21 06:22:38
  • Python线程之如何解决共享变量问题

    2023-08-27 16:15:56
  • Ajax发明人:Ajax并不适合所有网站

    2008-01-30 12:20:00
  • pandas pd.read_csv()函数中parse_dates()参数的用法说明

    2023-07-22 04:51:26
  • sqlserver bcp(数据导入导出工具)一般用法与命令详解

    2012-07-11 15:56:39
  • django从请求到响应的过程深入讲解

    2021-08-09 19:41:06
  • VML模拟Rose画流程图代码

    2008-09-02 10:58:00
  • 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
  • asp之家 网络编程 m.aspxhome.com