1.SocketServer模块编写的TCP服务器端代码
Socketserver原理图
服务端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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() #持续接受客户端的连接 |
客户端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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程序
服务端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
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() |
客户端:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
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