使用python中的socket实现服务器和客户端,并完成图片的传输 使用python中的socket实现服务器和客户端,并完成图片的传输。

使用python中的socket实现服务器和客户端,并完成图片的传输。

socket服务器代码:

[python]  view plain  copy
  1. import socket  
  2. import os  
  3. sk=socket.socket()  
  4. print(sk)  
  5. address=('127.0.0.1',8000)  
  6. sk.bind(address)     #将本地地址与一个socket绑定在一起  
  7. sk.listen(3)          #最多允许有3个客户称呼  
  8. print('waiting........ ')  
  9. BASE_DIR = os.path.dirname(os.path.abspath(__file__))     #26:11,当前目录  
  10. while 1:  
  11.     conn,addr = sk.accept()  
  12.     while 1:  
  13.         # client = conn  
  14.         data = conn.recv(1024)       #缓冲区大小,接收文件的个数               第一次获取请求  
  15.         # client.send("HTTP/1.1 200 OK\r\n\r\n".encode("utf8"))  
  16.         # client.send("<h1 style='color:red'>Hello,yuan</h1>".encode("utf8"))  
  17.   
  18.         cmd,filename,filesize=str(data,'utf8').split('|')   #第一次提取请求信息,获取  post name size  
  19.         #filesize = os.stat(data)  
  20.         path = os.path.join(BASE_DIR,'MNIST_80',filename)  
  21.         filesize=int(filesize)  
  22.   
  23.         f = open(path,'ab')  
  24.         has_receive=0  
  25.         while has_receive!=filesize:  
  26.             data=conn.recv(1024)                        #第二次获取请求,这次获取的就是传递的具体内容了,1024为文件发送的单位  
  27.             f.write(data)  
  28.             has_receive+=len(data)  
  29.         f.close()  

socket客户端代码:

[python]  view plain  copy
  1. import socket  
  2. import os  
  3. sk = socket.socket()  
  4. print(sk)  
  5.   
  6. address=('127.0.0.1',8000)  
  7. sk.connect(address)  
  8.   
  9. BASE_DIR = os.path.dirname(os.path.abspath(__file__))  
  10.   
  11. while True:  
  12.     inp=input('>>>>>>>>')    #post|11.png  
  13.   
  14.     cmd,path=inp.split('|')                         #拿到post,以及文件11.jpg  
  15.   
  16.   
  17.     path=os.path.join(BASE_DIR,path)  
  18.   
  19.     filename = os.path.basename(path)  
  20.   
  21.     file_size = os.stat(path).st_size  
  22.   
  23.     file_info='post|%s|%s'%(filename,file_size)      #split获取字符串的信息       以此方式打包,依次为   cmd/name/size  
  24.     sk.sendall(bytes(file_info,'utf8'))                #第一次发送请求,不是具体内容,而是先发送数据信息  
  25.   
  26.     f = open(path,'rb')  
  27.     has_sent=0  
  28.     while has_sent!=file_size:  
  29.         data = f.read(1024)  
  30.         sk.sendall(data)                              #发送真实数据  
  31.         has_sent+=len(data)  
  32.   
  33.     f.close()  
  34.     print('上传成功')  

在socket上,完全没有问题,获取的数据,都为unicode,直接写入到文件里,如果读取大小 设置充足的话,就会将图片读取出来。但是,用同样的一张图,从微信小程序发送过来,会添加上一些其他信息,直接读取,就没有办法将图片读取出来了。
  数据传送的时候,先转换成bytes文件,接收的时候再转化为str,才能识别文字信息。小程序这到底怎么搞啊。?

下面是我,修改的更为简单的socket服务器。。

[python]  view plain  copy
  1. import socket  
  2. import os  
  3. sk=socket.socket()  
  4. print(sk)  
  5. address=('127.0.0.1',8000)  
  6. sk.bind(address)     #将本地地址与一个socket绑定在一起  
  7. sk.listen(3)          #最多允许有3个客户称呼  
  8. print('waiting........ ')  
  9. BASE_DIR = os.path.dirname(os.path.abspath(__file__))     #26:11,当前目录  
  10. while 1:  
  11.     conn,addr = sk.accept()  
  12.     while 1:  
  13.         filename = '123456789.jpg'  
  14.         path = os.path.join(BASE_DIR,'MNIST_80',filename)  
  15.         f = open(path,'ab')  
  16.   
  17.         data=conn.recv(50000)  
  18.         f.write(data)  
  19.   
  20.         f.close()  
  21.         print(data)                #图片数据  
  22.         #print(type(data))  



2018.3.12微信小程序想用python传输,还是只能接收到一堆别的东西。。貌似是json格式啊??我也不懂,准备下午转战java试试吧,毕竟教程比较多。。。。。

猜你喜欢

转载自blog.csdn.net/jacke121/article/details/80274845