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

基于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()

转载于:https://my.oschina.net/u/4197529/blog/3099241

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值