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也就是客户端。到此也就完成了服务端和客户端的文件传输,是不是很简单?想看更多进阶的网络编程,敬请期待噢!!!