利用网络编程实现一台服务器对多台客户机实现上传和下载功能
时间: 2024-04-15 20:30:01 浏览: 18
要实现一台服务器对多台客户机实现上传和下载功能,可以使用网络编程中的Socket套接字来实现。下面是一个简单的示例代码:
服务器端:
```python
import socket
import threading
import os
def handle_client(client_socket, address):
print(f"New connection from {address}")
# 接收客户端请求
request = client_socket.recv(1024).decode()
# 判断客户端请求类型
if request == "upload":
handle_upload(client_socket)
elif request == "download":
handle_download(client_socket)
client_socket.close()
print(f"Connection from {address} closed")
def handle_upload(client_socket):
# 接收上传文件名
filename = client_socket.recv(1024).decode()
# 接收文件内容并保存
with open(filename, "wb") as file:
while True:
data = client_socket.recv(1024)
if not data:
break
file.write(data)
print(f"Upload complete: {filename}")
def handle_download(client_socket):
# 接收下载文件名
filename = client_socket.recv(1024).decode()
# 判断文件是否存在
if not os.path.exists(filename):
client_socket.send(b"File not found")
return
# 发送文件内容
with open(filename, "rb") as file:
while True:
data = file.read(1024)
if not data:
break
client_socket.send(data)
print(f"Download complete: {filename}")
def start_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("127.0.0.1", 8888))
server_socket.listen(5)
print("Server started, listening on port 8888")
while True:
client_socket, address = server_socket.accept()
client_thread = threading.Thread(target=handle_client, args=(client_socket, address))
client_thread.start()
start_server()
```
客户端:
```python
import socket
def upload_file(filename):
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("127.0.0.1", 8888))
# 发送请求类型
client_socket.send(b"upload")
# 发送上传文件名
client_socket.send(filename.encode())
# 发送文件内容
with open(filename, "rb") as file:
while True:
data = file.read(1024)
if not data:
break
client_socket.send(data)
print(f"Upload complete: {filename}")
def download_file(filename):
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("127.0.0.1", 8888))
# 发送请求类型
client_socket.send(b"download")
# 发送下载文件名
client_socket.send(filename.encode())
# 接收文件内容并保存
with open(filename, "wb") as file:
while True:
data = client_socket.recv(1024)
if not data:
break
file.write(data)
print(f"Download complete: {filename}")
# 示例代码中假设客户端与服务器在同一台机器上,并使用本地回环地址 127.0.0.1 和端口号 8888。
# 若要连接不同机器上的服务器,请将服务器地址和端口号修改为正确的值。
# 上传文件示例
upload_file("file.txt")
# 下载文件示例
download_file("file.txt")
```
以上代码是一个简单的实现,具体根据需求可以进行进一步的优化和完善。注意要确保服务器和客户端的地址和端口号一致,并根据实际情况修改代码中的文件名和路径。