使用python中的socket实现服务器和客户端,并完成图片的传输。
socket服务器代码:
- import socket
- import os
- sk=socket.socket()
- print(sk)
- address=('127.0.0.1',8000)
- sk.bind(address) #将本地地址与一个socket绑定在一起
- sk.listen(3) #最多允许有3个客户称呼
- print('waiting........ ')
- BASE_DIR = os.path.dirname(os.path.abspath(__file__)) #26:11,当前目录
- while 1:
- conn,addr = sk.accept()
- while 1:
- # client = conn
- data = conn.recv(1024) #缓冲区大小,接收文件的个数 第一次获取请求
- # client.send("HTTP/1.1 200 OK\r\n\r\n".encode("utf8"))
- # client.send("<h1 style='color:red'>Hello,yuan</h1>".encode("utf8"))
- cmd,filename,filesize=str(data,'utf8').split('|') #第一次提取请求信息,获取 post name size
- #filesize = os.stat(data)
- path = os.path.join(BASE_DIR,'MNIST_80',filename)
- filesize=int(filesize)
- f = open(path,'ab')
- has_receive=0
- while has_receive!=filesize:
- data=conn.recv(1024) #第二次获取请求,这次获取的就是传递的具体内容了,1024为文件发送的单位
- f.write(data)
- has_receive+=len(data)
- f.close()
socket客户端代码:
- import socket
- import os
- sk = socket.socket()
- print(sk)
- address=('127.0.0.1',8000)
- sk.connect(address)
- BASE_DIR = os.path.dirname(os.path.abspath(__file__))
- while True:
- inp=input('>>>>>>>>') #post|11.png
- cmd,path=inp.split('|') #拿到post,以及文件11.jpg
- path=os.path.join(BASE_DIR,path)
- filename = os.path.basename(path)
- file_size = os.stat(path).st_size
- file_info='post|%s|%s'%(filename,file_size) #split获取字符串的信息 以此方式打包,依次为 cmd/name/size
- sk.sendall(bytes(file_info,'utf8')) #第一次发送请求,不是具体内容,而是先发送数据信息
- f = open(path,'rb')
- has_sent=0
- while has_sent!=file_size:
- data = f.read(1024)
- sk.sendall(data) #发送真实数据
- has_sent+=len(data)
- f.close()
- print('上传成功')
在socket上,完全没有问题,获取的数据,都为unicode,直接写入到文件里,如果读取大小 设置充足的话,就会将图片读取出来。但是,用同样的一张图,从微信小程序发送过来,会添加上一些其他信息,直接读取,就没有办法将图片读取出来了。
数据传送的时候,先转换成bytes文件,接收的时候再转化为str,才能识别文字信息。小程序这到底怎么搞啊。?
下面是我,修改的更为简单的socket服务器。。
- import socket
- import os
- sk=socket.socket()
- print(sk)
- address=('127.0.0.1',8000)
- sk.bind(address) #将本地地址与一个socket绑定在一起
- sk.listen(3) #最多允许有3个客户称呼
- print('waiting........ ')
- BASE_DIR = os.path.dirname(os.path.abspath(__file__)) #26:11,当前目录
- while 1:
- conn,addr = sk.accept()
- while 1:
- filename = '123456789.jpg'
- path = os.path.join(BASE_DIR,'MNIST_80',filename)
- f = open(path,'ab')
- data=conn.recv(50000)
- f.write(data)
- f.close()
- print(data) #图片数据
- #print(type(data))
2018.3.12微信小程序想用python传输,还是只能接收到一堆别的东西。。貌似是json格式啊??我也不懂,准备下午转战java试试吧,毕竟教程比较多。。。。。