通过socket网络编程进行文件传输

socket(简称 套接字) 是进程间通信的一种方式。在使用socket进行通信测试时,我利用双开pycharm分别作为服务端和客户端,通过客户端发送信息给服务端,服务端可以通过处理客户端的信息进行相关的操作。
首先建立客户端:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('***.***.***.***', 8080))
file_name = input('请输入你想要的文件名:')
t = input('是否是文本文件(是输入1 否输入2)')
s.send(file_name.encode('utf8'))
if t == '1':
    ty = 'w'
else:
    ty = 'wb'

with open(file_name, ty) as file:
    while True:
        data = s.recv(1024)
        if not data:
            break
        file.write(data)
s.close()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

这里创建了套接字,

s.connect(('***.***.***.***', 8080))

这里是连接本地的ip地址以及自己定义的端口号,端口号应该去1024以上至65535之间

s.send(file_name.encode('utf8'))

将需要从服务端获取的文件名发送给服务端。

if t == '1':
    ty = 'w'
else:
    ty = 'wb'

这段代码可以忽略,这是为了测试时写的代码,为了传输文本文件和二进制文件而设置,如果要传输的是文本文件应选择**‘w’只写模式,如果是音频,图像等二进制文件应取‘wb’**模式。

with open(file_name, ty) as file:
    while True:
        data = s.recv(1024)
        if not data:
            break
        file.write(data)

ty就是上述代码选择读写格式的变量可直接认为它是**‘wb’** 模式,因为我的代码是传输的二进制文件,如果你想传输文本文件自行改为**‘w’** 即可。在将文件名发送给服务端后,服务端会把所需文件发送给客户端。s.recv 用于接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。括号里的1024指1024个字节即1K,如果数据大于1K不使用while循环循环读取的话会导致数据丢失,从而数据接收失败。直到data 读取为空时退出循环,在读取的同时写入数据到文件中。最后关闭客户端。
在服务端中,我们需要接收来自客户端的请求,获取客户端发送过来的文件名。
代码如下:

import socket

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('',8080))
s.listen(128)

x,y= s.accept()
file_name = x.recv(1024)
data = open(file_name.decode('utf8'),'rb')
x.send(data.read())
s.close()

同样,服务端也要创建套接字。与客户端不同在于它需要绑定客户端的端口,这是他们能互相通信的标志。

s.listen(128)

这里用于监听从客户端发过来的信息。收到请求后,s.accept()返回值是一个新的套接字描述符,它代表的是和客户端的新的连接,可以把它理解成是一个客户端的socket,这个socket包含的是客户端的ip和port信息 。利用python拆包,想获取的就是客户端的IP地址,同样利用recv获取来自客户端的消息,这里是客户端发来的文件名。但是值得注意的是这里是x.recv() 而不是s.recv() ,

data = open(file_name.decode('utf8'),'rb')
x.send(data.read())

通过获取的文件名,我们来打开服务端的文件,之后将读取的文件发送给x也就是客户端。到此也就完成了服务端和客户端的文件传输,是不是很简单?想看更多进阶的网络编程,敬请期待噢!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值