如何使用socket模块实现客户端与服务器之间的数据传输。
直接上代码:
服务器端
功能:计算客户端传输过来的文件个数、文件总长度、字符串总次数、字符串总个数、数据总长度,并且总长度不大于max_len,否则服务器将断开联系
异常处理
import socket
server=socket.socket()
server.bind(("localhost",5555))
server.listen()
conn,address=server.accept()
file_number=0#文件个数
file_len=0#文件总字长
data_number=0#字符串个数
data_len=0#数据长度
recv_len=0#总字长
max_len=2000000
#文件处理方法
def file_deal(data,file_number):
with open(str(file_number)+'.jpg','wb')as f:
f.write(data)
print("文件保存成功!")
while True:
try:
#传输数据超过max_len则断开数据传输
if recv_len>max_len:
print("客户端传输数据超过{}字节,服务器断开连接".format(max_len))
print("本次一共传输{}字节的数据那,其中字符串为{}字节,传输{}次,文件为有{}字节,传输{}次".format(recv_len, data_len, data_number, file_len, file_number))
#conn.send("你已经超出传输范围{},服务器断开连接".format(max_len))
break
recv_data=conn.recv(1000)
#recv处理层!
#服务器和客户端达成协议,客户端向服务器端发来的指令:
# 发送文件为2,发送数据为1,结束发送为4,继续发送为3
#send处理层:
#回复1为收到,2为未收到!
if recv_data.decode('utf-8')=='1':
print("准备客户端发送过来的字符串!")
data_recv=conn.recv(1000)
print("收到从客户端发送过来的字符串:",data_recv.decode('utf-8'))
data_number+=1#字符串总个数
recv_len+=len(data_recv)#总字长
data_len+=len(data_recv)#字符串总长
elif recv_data.decode('utf-8')=='2':
print("准备接受客户端发送过来的文件")
data_recv=conn.recv(100000000)
file_deal(data_recv,file_number)
file_number+=1#文件个数
recv_len += len(data_recv)#总字长
file_len+=len(data_recv)#文件总字长
elif recv_data.decode('utf-8')=='3':
print("客户端重新发送数据")
data_recv=conn.recv(10000)
continue
else:
print("客户端已断开联系!我也断开联系吧")
data_recv=conn.recv(10000)
print("本次一共传输{}字节的数据那,其中字符串为{}字节,传输{}次,文件为有{}字节,传输{}次".format(recv_len, data_len, data_number, file__len, file_number))
break
except:
print("客户端突然中断")
break
server.close()
客户端
功能:向服务器端发送文件和字符串,并进行异常处理
import socket,os
def isfile(filename):
result=os.path.exists(filename)
return result
def readfile(filename):
with open(filename,'rb')as f:
data=f.read()
return data
specialchar=['1','2','3','4']
client=socket.socket()
client.connect(('localhost',5555))
while True:
try:
#if client.recv(1000):
#break
data_send=input("请输入您想发送的数据类型!1为字符串2为文件4为结束发送3为继续发送:").strip()
if data_send not in specialchar:
continue
client.send(data_send.encode('utf-8'))
if data_send=='1':
while True:
data_send=input("请输入您想发送的字符串:").strip()
if data_send not in specialchar:
client.send(data_send.encode('utf-8'))
break
else:
continue
elif data_send=='2':
while True:
data_filename=input("请您输入你想发送的文件名:").strip()
if isfile(data_filename):
client.send(readfile(data_filename))
break
else:
print("请重新输入文件!")
continue
elif data_send=='3':
client.send('3'.encode('utf-8'))
continue
elif data_send=='4':
client.send('4'.encode('utf-8'))
break
else:
print("输入错误!请重新输入!")
continue
except:
print("服务器端突然中断!")
break
client.close()
``
实现功能:实时传输数据(包括字符串、文件),客户端文件的保存等。
实现效果:
客户端:
服务器端:
异常处理:
服务器端突然关闭:
客户端突然关闭:
一个非常简单的socket通信就是实现了。实现功能:
客户端:
向服务器端发送文件和字符串,并进行异常处理
服务器端:
计算客户端传输过来的文件个数、文件总长度、字符串总次数、字符串总个数、数据总长度,并且总长度不大于max_len,否则服务器将断开联系、异常处理
如果对我的文章感兴趣,请为我点一个赞,如果有python的知识需要了解或探讨,可以加本人微信:cuiliang1666457052