基于TCP客户端和服务端的数据交换
TCP套接字
TCP套接字是面向连接、基于流(stream)的套接字,数据收发无边界。send
调用后数据移动至输出缓冲,recv
调用瞬间,从输入缓冲读取数据。具有一下特性:
- I/O缓冲在创建socket时生成;
- 各TCP socket的I/O缓冲独立存在;
- 关闭socket,输出缓冲中的数据继续传输,输入缓冲中的数据将丢失。
具体实现
需求
使用TCP完成数据的上传和下载
(1) 准备:
文件夹中新建四个txt文件,1.txt、2.txt、3.txt、4.txt
(2) 编写TCP客户端程序,
① TCP的客户端具有的功能:输入 文件的名字,发送到服务器 实现文件的下载
② 客户端接收服务器端返回的数据进行判断,如果是 标识: error,提示用户文件不存在,否则将数据保存到本地
(3) 编写服务端程序
① 接收客户端的消息,根据客户端发来的文件名,从桌面的info文件夹中读取相应的文件内容返回给客户端
② 如果要下载的文件不存在,则返回 标识: error
客户端
import socket
# 创建并连接
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('localhost', 6060))
# 输入并发送文件名
filename = input('Enter the file name you want to download:')
client.send(filename.encode('utf-8'))
# 接受判断标识
recv_content = client.recv(1024).decode('utf-8')
if recv_content == 'error':
print(f'there is no {filename}.')
elif recv_content == 'Ready to download':
print(recv_content)
# 使用循环从输入缓冲中读取并保存文件
while True:
recv_data = client.recv(1024)
if recv_data:
with open(filename,'ab') as f_obj:
f_obj.write(recv_data)
else:
print('Down completely')
break
client.close()
服务端
import socket
# 创建并接受连接
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,True)
server.bind(('192.168.43.112', 6060))
server.listen(128)
client_service, client_ip_port = server.accept()
print(f'{client_ip_port} is connected')
# 接受文件名并按路径打开
recv_data = client_service.recv(1024)
filename = recv_data.decode('utf-8')
dirc = "C:\\Users\\wz2310\\Desktop\\info\\"
try:
f = open(dirc+filename,'rb')
except Exception as error:
print(error)
# 文件不存在返回错误
client_service.send('error'.encode('utf-8'))
else:
# 文件存在先返回提示再发送文件
client_service.send('Ready to download'.encode('utf-8'))
send_data = f.read()
print(len(send_data))
client_service.send(send_data)
f.close()
client_service.close()
server.close()
来源:oschina
链接:https://my.oschina.net/u/4197529/blog/3099241