使用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("

Hello,yuan

".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试试吧,毕竟教程比较多。。。。。

你可能感兴趣的:(python)