写一个服务端和客户端具有聊天发送文件的功能的代码
时间: 2023-12-06 19:44:22 浏览: 30
以下是一个简单的Python代码示例,实现了服务端和客户端之间的聊天和文件传输功能。
### 服务端代码
```python
import socket
import threading
import os
SERVER_HOST = '0.0.0.0'
SERVER_PORT = 8000
BUFFER_SIZE = 1024
def handle_client(client_socket, client_address):
print(f"[*] Accepted connection from {client_address[0]}:{client_address[1]}")
while True:
try:
data = client_socket.recv(BUFFER_SIZE).decode('utf-8')
if not data:
print(f"[!] {client_address[0]}:{client_address[1]} disconnected")
break
if data.startswith('sendfile'):
filename = data.split()[1]
file_size = os.path.getsize(filename)
client_socket.send(f"{file_size}".encode('utf-8'))
with open(filename, 'rb') as f:
data = f.read(BUFFER_SIZE)
while data:
client_socket.send(data)
data = f.read(BUFFER_SIZE)
else:
print(f"[{client_address[0]}:{client_address[1]}] {data}")
except Exception as e:
print(f"[!] Error: {e}")
break
client_socket.close()
print(f"[*] Connection from {client_address[0]}:{client_address[1]} closed")
def start_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((SERVER_HOST, SERVER_PORT))
server_socket.listen(5)
print(f"[*] Listening on {SERVER_HOST}:{SERVER_PORT}")
while True:
client_socket, client_address = server_socket.accept()
client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
client_thread.start()
if __name__ == '__main__':
start_server()
```
### 客户端代码
```python
import socket
import os
SERVER_HOST = '127.0.0.1'
SERVER_PORT = 8000
BUFFER_SIZE = 1024
def send_file(client_socket, filename):
client_socket.send(f"sendfile {filename}".encode('utf-8'))
file_size = int(client_socket.recv(BUFFER_SIZE).decode('utf-8'))
print(f"[+] File size: {file_size}")
with open(filename, 'wb') as f:
data = client_socket.recv(BUFFER_SIZE)
total_recv = len(data)
f.write(data)
while total_recv < file_size:
data = client_socket.recv(BUFFER_SIZE)
total_recv += len(data)
f.write(data)
print(f"[+] {total_recv}/{file_size} bytes received")
print(f"[+] File received: {filename}")
def start_client():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((SERVER_HOST, SERVER_PORT))
while True:
try:
data = input("[>] ")
if not data:
break
if data.startswith('send'):
filename = data.split()[1]
send_file(client_socket, filename)
continue
client_socket.send(data.encode('utf-8'))
except Exception as e:
print(f"[!] Error: {e}")
break
client_socket.close()
print("[*] Connection closed")
if __name__ == '__main__':
start_client()
```
这里的示例代码使用了Python的socket库实现服务端和客户端之间的通信,其中,服务端程序可以接收客户端发送的聊天消息和文件请求,客户端程序可以发送聊天消息和文件给服务器。注意,这里的文件传输只支持小文件,如果需要支持大文件传输,则需要对文件进行分块处理。