python实现socket文件传输
时间: 2023-08-22 12:14:00 浏览: 120
基于python+socket的文件传输程序,能传输整个文件夹
Python可以使用socket模块来实现文件传输。在客户端和服务器端都需要编写相应的代码来建立连接并传输文件。
在客户端,可以使用socket模块的socket函数创建一个套接字对象,并使用connect函数连接到服务器端的IP地址和端口号。然后,可以使用open函数打开要传输的文件,并使用read函数读取文件数据。接下来,可以使用send函数将文件数据发送给服务器端。最后,使用close函数关闭套接字。
在服务器端,同样使用socket模块的socket函数创建一个套接字对象,并使用bind函数绑定服务器端的IP地址和端口号。然后,使用listen函数监听连接请求,并使用accept函数接受客户端的连接。接下来,可以使用recv函数接收客户端发送的文件数据,并使用write函数将文件数据写入到服务器端的文件中。最后,使用close函数关闭套接字。
需要注意的是,在传输文件时,可以使用struct模块来打包文件的相关信息,如文件名和文件大小,以便在接收端正确地保存文件。
下面是一个示例代码,展示了如何使用socket模块实现文件传输:
客户端client.py:
```python
import socket
import os
import sys
import struct
def socket_client():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('服务器IP地址', 端口号))
except socket.error as msg:
print(msg)
sys.exit(1)
filepath = '要传输的文件路径'
if os.path.isfile(filepath):
fileinfo_size = struct.calcsize('128sq')
fhead = struct.pack('128sq', bytes(os.path.basename(filepath).encode('utf-8')), os.stat(filepath).st_size)
s.send(fhead)
print('客户端文件路径: {0}'.format(filepath))
with open(filepath, 'rb') as fp:
while True:
data = fp.read(1024)
if not data:
print('{0} 文件发送完毕...'.format(filepath))
break
s.send(data)
s.close()
if __name__ == '__main__':
socket_client()
```
服务器端server.py:
```python
import socket
import os
import struct
def socket_server():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('服务器IP地址', 端口号))
s.listen(10)
except socket.error as msg:
print(msg)
sys.exit(1)
while True:
conn, addr = s.accept()
print('连接地址:{0}'.format(addr))
while True:
fileinfo_size = struct.calcsize('128sq')
buf = conn.recv(fileinfo_size)
if buf:
filename, filesize = struct.unpack('128sq', buf)
filename = filename.decode('utf-8').strip('\x00')
filename = 'new_' + filename
filesize = int(filesize)
print('接收的文件名为:{0},文件大小为:{1}'.format(filename, filesize))
with open(filename, 'wb') as fp:
while True:
data = conn.recv(1024)
received_size += len(data)
fp.write(data)
if received_size >= filesize:
break
conn.close()
break
if __name__ == '__main__':
socket_server()
```
请注意,上述代码中的服务器IP地址和端口号需要根据实际情况进行修改。另外,客户端和服务器端的代码需要分别在不同的机器上运行,且需要保证服务器端先运行。
希望对你有帮助!
#### 引用[.reference_title]
- *1* *2* *3* [Python使用socket传输文件](https://blog.csdn.net/weixin_44219242/article/details/125935964)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文