Python--网络编程-----通过socket收发文件软件开发--面向对象开发

服务端实现

 1 import socket
 2 import struct
 3 import json
 4 import os
 5
 6
 7 class MYTCPServer:
 8     address_family = socket.AF_INET
 9     socket_type = socket.SOCK_STREAM
10     allow_reuse_address = False
11     max_packet_size = 8192
12     coding = ‘utf-8‘
13     request_queue_size = 5
14     server_dir = r‘C:\Users\xudachen\PycharmProjects\Python全栈开发\第三模块\网络编程\通过socket发送文件\服务端\file_upload‘
15
16     def __init__(self, server_address, bind_and_active=True):
17         """Constructor. May be extended, do not override"""
18         self.server_address = server_address
19         self.socket = socket.socket(self.address_family, self.socket_type)
20
21         if bind_and_active:
22             try:
23                 self.server_bind()
24                 self.server_activate()
25             except:
26                 self.server_close()
27                 raise
28
29     def server_bind(self):
30         """Called by constructor to bind the socket"""
31         if self.allow_reuse_address:
32             self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
33         self.socket.bind(self.server_address)
34         self.server_address = self.socket.getsockname()
35
36     def server_activate(self):
37         """Called by constructor to activate the server"""
38         self.socket.listen(self.request_queue_size)
39
40     def server_close(self):
41         """Called to clean-up the server"""
42         self.socket.close()
43
44     def get_request(self):
45         """Get the request and client address from the socket"""
46         return self.socket.accept()
47
48     def close_request(self, request):
49         """Called to clean-up an individual request"""
50         request.close()
51
52     def run(self):
53         while True:
54             self.conn, self.client_addr = self.get_request()
55             print(‘from client‘, self.client_addr)
56             while True:
57                 try:
58                     head_struct = self.conn.recv(4)
59                     if not head_struct:
60                         break
61
62                     head_len = struct.unpack(‘i‘, head_struct)[0]
63                     head_json = self.conn.recv(head_len).decode(self.coding)
64                     head_dic = json.loads(head_json)
65
66                     print(head_dic)
67                     cmd = head_dic[‘cmd‘]
68                     if hasattr(self, cmd):
69                         func = getattr(self, cmd)
70                         func(head_dic)
71                 except Exception:
72                     break
73
74     def put(self, args):
75         file_path = os.path.normpath(os.path.join(self.server_dir, args[‘filename‘]))
76
77         filesize = args[‘filesize‘]
78         recv_size = 0
79         print(‘---->‘, file_path)
80         with open(file_path, ‘wb‘) as f:
81             while recv_size < filesize:
82                 recv_data = self.conn.recv(self.max_packet_size)
83                 f.write(recv_data)
84                 recv_size += len(recv_data)
85                 print(‘recvsize:%s filesize:%s‘ % (recv_size, filesize))
86
87
88 tcpserver1 = MYTCPServer((‘127.0.0.1‘, 8080))
89 tcpserver1.run()

客户端实现

 1 import socket
 2 import struct
 3 import json
 4 import os
 5
 6
 7 class MYTCPClient:
 8     address_family = socket.AF_INET
 9     socket_type = socket.SOCK_STREAM
10     allow_reuse_address = False
11     max_packet_size = 8192
12     coding = ‘utf-8‘
13     request_queue_size = 5
14
15     def __init__(self, server_address, connect=True):
16         self.server_address = server_address
17         self.socket = socket.socket(self.address_family, self.socket_type)
18
19         if connect:
20             try:
21                 self.client_connect()
22             except:
23                 self.client_close()
24                 raise
25
26     def client_connect(self):
27         self.socket.connect(self.server_address)
28
29     def client_close(self):
30         self.socket.close()
31
32     def run(self):
33         while True:
34             inp = input(">>:").strip()  # put test.py
35             if not inp:
36                 continue
37             l = inp.split()  # [‘put‘,‘test.py‘]
38             cmd = l[0]  # put
39             if hasattr(self, cmd):
40                 func = getattr(self, cmd)
41                 func(l)
42
43     def put(self, args):  # [‘put‘,‘test.py‘]
44         cmd = args[0]  # put
45         filename = args[1]  # test.py
46         if not os.path.isfile(filename):
47             print(‘file:%s is not exists‘ % filename)
48             return
49         else:
50             filesize = os.path.getsize(filename)
51
52         head_dic = {‘cmd‘: cmd,
53                     ‘filename‘: os.path.basename(filename),
54                     ‘filesize‘: filesize}
55         print(head_dic)
56         head_json = json.dumps(head_dic)
57         head_json_bytes = bytes(head_json, encoding=self.coding)
58
59         head_struct = struct.pack(‘i‘, len(head_json_bytes))
60         self.socket.send(head_struct)
61         self.socket.send(head_json_bytes)
62         send_size = 0
63         with open(filename, ‘rb‘) as f:
64             for line in f:
65                 self.socket.send(line)
66                 send_size += len(line)
67                 print(send_size)
68             else:
69                 print(‘upload successful‘)
70
71
72 client = MYTCPClient((‘127.0.0.1‘, 8080))
73 client.run()

先启动服务端,再启动客户端,在客户端输入put test.py

客户端运行结果为;

 1 >>:put test.py
 2 {‘cmd‘: ‘put‘, ‘filename‘: ‘test.py‘, ‘filesize‘: 1014}
 3 17
 4 20
 5 61
 6 83
 7 86
 8 128
 9 140
10 142
11 187
12 201
13 241
14 253
15 255
16 268
17 294
18 313
19 328
20 354
21 386
22 398
23 400
24 413
25 416
26 440
27 443
28 477
29 489
30 504
31 507
32 536
33 593
34 632
35 651
36 687
37 723
38 779
39 805
40 807
41 822
42 856
43 877
44 879
45 894
46 896
47 955
48 988
49 1014
50 upload successful
51 >>:

服务端运行结果:

1 from client (‘127.0.0.1‘, 55771)
2 {‘cmd‘: ‘put‘, ‘filename‘: ‘test.py‘, ‘filesize‘: 1014}
3 ----> C:\Users\xudachen\PycharmProjects\Python全栈开发\第三模块\网络编程\通过socket发送文件\服务端\file_upload\test.py
4 recvsize:1014 filesize:1014

实际效果:

注意,在windows系统中使用pycharm,上传成功后,并不会立即在上传文件夹中显示,需要找到文件夹路径,点进去,然后才会在pycharm中看到,

原文地址:https://www.cnblogs.com/xudachen/p/8855181.html

时间: 2024-08-30 11:28:04

Python--网络编程-----通过socket收发文件软件开发--面向对象开发的相关文章

python 网络编程:socket和select实现伪并发

上节地址:Python网络编程:socket 先补充点内容: 一.send和sendall区别 send,sendall ret = send('safagsgdsegsdgew') #send 发送完成后会有一个返回值,告知发送了多少,并不一定会把数据全部发送过去. sendall:内部调用send,将数据全部发送完为止. 因此我们使用时最好使用sendall 二.粘包 粘包问题需要理解recv()的使用,我们定义接收值的时候会写recv(1024)表示一次接收1024字节,但是有时候接收的数

python 网络编程:socket

在学习socket之前,我们先复习下相关的网络知识. OSI七层模型:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层.OSI七层模型是由国际标准化组织ISO定义的网络的基本结构,不仅包括一些概念和结构,还包括一系列的协议. TCP/IP四层模型:既然有OSI七层模型,为什么我们还要定义一个TCP/IP的四层模型呢,那是因为OSI七层模型对应面过于宽泛,很多概念实现不了,也没必要实现,因此,实际生产中广泛应用的是TCP/IP四层结构,他们的对应关系如下表: TCP/IP OSI 应用层

python 网络编程(Socket)

# from wsgiref.simple_server import make_server## def RunServer(environ,start_response):# start_response(status='200 OK',headers=[('Content-Type','text/html')])# url=environ['PATH_INFO']## return "guozhendong"## if __name__=='__main__':# httpd=m

python网络编程基础--socket的简介,以及使用socket来搭建一个简单的udp小程序

socket介绍: socket(简称套接字),是进程间通讯的一个工具,他能实现把数据从一方传输到另一方,完成不同电脑上进程之间的通讯,它好比数据的搬运工.socket应用:不夸张来说,只要跟网络相关的应用程序或者软件都使用到了socket, 比如:微信,qq等使用socket创建udp网络程序的流程:1,创建客户端套接字2,发送/接收数据3,关闭套接字使用程序展现流程 :(使用的 ide为pycharm):1,首先创建socket,在 Python 中 使用socket 模块的函数 socke

Python 网络编程和Socket

2017-07-24 20:43:49 Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求.Http协议主要的操作流程是request-response即请求响应.我们可以利用python中的socket库完成连接的建立,然后使用GET方法获取服务器端的数据. 一.使用socket获取网页 import socket #套接字的参数声明,不用修改直接使用 mysock = socket.socket(socket.AF_INET,s

python网络编程:socket,gethostname,gethostbyname

功能:打印主机名和主机IP: [[email protected] python]# cat socket1.py #!/usr/bin/python import socket host_name = socket.gethostname() print "hostname:%s" % host_name print "IP address: %s" %socket.gethostbyname(host_name) 运行结果: [[email protected]

[python网络编程]利用socket编写简单的服务器

利用socket编写简单的服务器 步骤解析 建立socket对象 这一步跟我们上次使用socket做客户端是一样的,都需要有一个socket连接 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 设置socket选项(setsockopt) 选项介绍setsockopt(set socket option),参数设置格式:setsockopt(level,optname,value) 各选项的关系:1.level:level的设定决定了op

【学习笔记】Python网络编程(二)socket处理多个连接

贴代码,server端: import socket # s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) host =  '' port = 6074 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.bind((host,port)) s.listen(1) while 1:     conn,addr = s.accept()     while 1:         pri

10.python网络编程(socket server 实现并发 part 2)

一.基于tcp的socket通信的基本原理分析. 基于tcp的socket通信,主要依靠两个循环,分别是连接循环和通信循环. 这个前面的文章有写过,在这里就不再重复了. 二.socketserver实现多并发的原理分析. 1.server类: 2.reques类. 类继承关系: 示例代码: import socketserver import struct import json import os class FtpServer(socketserver.BaseRequestHandler)