基于TCP客户端和服务端的数据交换

大城市里の小女人 提交于 2019-12-09 15:22:17

基于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()
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!