代码实现TCP文件上传与下载
时间: 2023-05-11 12:05:22 浏览: 192
TCP文件上传与下载的实现需要使用Socket编程。以下是一个简单的Python实现:
文件上传:
1. 客户端连接服务器,并发送文件名和文件大小。
2. 服务器接收到文件名和文件大小后,创建一个新的文件,并等待客户端发送文件内容。
3. 客户端读取文件内容,并将其发送到服务器。
4. 服务器接收到文件内容后,将其写入文件中。
代码实现:
客户端:
```python
import socket
def send_file(filename, host, port):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))
filesize = os.path.getsize(filename)
s.sendall(f"{filename}:{filesize}".encode())
with open(filename, "rb") as f:
while True:
data = f.read(1024)
if not data:
break
s.sendall(data)
print("File sent successfully.")
if __name__ == "__main__":
send_file("test.txt", "localhost", 8000)
```
服务器:
```python
import socket
def receive_file(host, port):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((host, port))
s.listen()
conn, addr = s.accept()
with conn:
print(f"Connected by {addr}")
data = conn.recv(1024).decode()
filename, filesize = data.split(":")
filesize = int(filesize)
with open(filename, "wb") as f:
while True:
data = conn.recv(1024)
if not data:
break
f.write(data)
print("File received successfully.")
if __name__ == "__main__":
receive_file("localhost", 8000)
```
文件下载:
1. 客户端连接服务器,并发送要下载的文件名。
2. 服务器接收到文件名后,打开文件并将其内容发送给客户端。
3. 客户端接收到文件内容后,将其写入文件中。
代码实现:
客户端:
```python
import socket
def receive_file(filename, host, port):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))
s.sendall(filename.encode())
with open(filename, "wb") as f:
while True:
data = s.recv(1024)
if not data:
break
f.write(data)
print("File received successfully.")
if __name__ == "__main__":
receive_file("test.txt", "localhost", 8000)
```
服务器:
```python
import socket
def send_file(filename, host, port):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((host, port))
s.listen()
conn, addr = s.accept()
with conn:
print(f"Connected by {addr}")
with open(filename, "rb") as f:
while True:
data = f.read(1024)
if not data:
break
conn.sendall(data)
print("File sent successfully.")
if __name__ == "__main__":
send_file("test.txt", "localhost", 8000)
```
以上代码只是一个简单的实现,实际应用中还需要考虑文件传输过程中的错误处理、断点续传等问题。