1. 程式人生 > >使用python中的socket實現伺服器和客戶端,並完成圖片的傳輸

使用python中的socket實現伺服器和客戶端,並完成圖片的傳輸

socket伺服器程式碼:

  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. while1:  
  11.     conn,addr = sk.accept()  
  12.     while1:  
  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.         cmd,filename,filesize=str(data,'utf8'
    ).split('|')   #第一次提取請求資訊,獲取  post name size
  18.         #filesize = os.stat(data)
  19.         path = os.path.join(BASE_DIR,'MNIST_80',filename)  
  20.         filesize=int(filesize)  
  21.         f = open(path,'ab')  
  22.         has_receive=0
  23.         while has_receive!=filesize:  
  24.             data=conn.recv(1024)                        
    #第二次獲取請求,這次獲取的就是傳遞的具體內容了,1024為檔案傳送的單位
  25.             f.write(data)  
  26.             has_receive+=len(data)  
  27.         f.close()  

socket客戶端程式碼:

  1. import socket  
  2. import os  
  3. sk = socket.socket()  
  4. print(sk)  
  5. address=('127.0.0.1',8000)  
  6. sk.connect(address)  
  7. BASE_DIR = os.path.dirname(os.path.abspath(__file__))  
  8. whileTrue:  
  9.     inp=input('>>>>>>>>')    #post|11.png
  10.     cmd,path=inp.split('|')                         #拿到post,以及檔案11.jpg
  11.     path=os.path.join(BASE_DIR,path)  
  12.     filename = os.path.basename(path)  
  13.     file_size = os.stat(path).st_size  
  14.     file_info='post|%s|%s'%(filename,file_size)      #split獲取字串的資訊       以此方式打包,依次為   cmd/name/size
  15.     sk.sendall(bytes(file_info,'utf8'))                #第一次傳送請求,不是具體內容,而是先發送資料資訊
  16.     f = open(path,'rb')  
  17.     has_sent=0
  18.     while has_sent!=file_size:  
  19.         data = f.read(1024)  
  20.         sk.sendall(data)                              #傳送真實資料
  21.         has_sent+=len(data)  
  22.     f.close()  
  23.     print('上傳成功')  

在socket上,完全沒有問題,獲取的資料,都為unicode,直接寫入到檔案裡,如果讀取大小 設定充足的話,就會將圖片讀取出來。但是,用同樣的一張圖,從微信小程式傳送過來,會新增上一些其他資訊,直接讀取,就沒有辦法將圖片讀取出來了。  資料傳送的時候,先轉換成bytes檔案,接收的時候再轉化為str,才能識別文字資訊。小程式這到底怎麼搞啊。?

下面是我,修改的更為簡單的socket伺服器。。

  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. while1:  
  11.     conn,addr = sk.accept()  
  12.     while1:  
  13.         filename = '123456789.jpg'
  14.         path = os.path.join(BASE_DIR,'MNIST_80',filename)  
  15.         f = open(path,'ab')  
  16.         data=conn.recv(50000)  
  17.         f.write(data)  
  18.         f.close()  
  19.         print(data)                #圖片資料
  20.         #print(type(data))
2018.3.12微信小程式想用python傳輸,還是隻能接收到一堆別的東西。。貌似是json格式啊??我也不懂,準備下午轉戰java試試吧,畢竟教程比較多。。。。。

相關推薦

使用pythonsocket實現伺服器客戶完成圖片傳輸

socket伺服器程式碼:import socket  import os  sk=socket.socket()  print(sk)  address=('127.0.0.1',8000)  sk.bind(address)     #將本地地址與一個socket繫結在一起sk.listen(3)    

使用pythonsocket實現伺服器客戶完成圖片傳輸

socket伺服器程式碼:import socket import os sk=socket.socket() print(sk) address=('127.0.0.1',8000) sk.bind(address) #將本地地址與一個socket繫結在一起 sk.

Socket通訊實現伺服器客戶對話

廣域網和區域網 介紹socket通訊前我們先介紹一下廣域網與區域網的概念。區域網簡稱LAN,是指在某一區域幾臺計算機組成的計算機組,區域網是封閉的,區域網經常採用共享通道,即共用同一條電纜。廣域網簡稱WAN,是一種跨越大的,地域性的地區性網路集合廣域網包含大大小

在Android上實現SSL握手實現伺服器客戶之間Socket互動

public class MySSLSocket extends Activity {      private static final int SERVER_PORT = 50030;//埠號      private static final String SERVER_IP = "218.206.17

在java網路程式設計實現伺服器客戶一對一的聊天

如果有多個客戶端接入,都可以傳送訊息給伺服器,但伺服器只和最後一個客戶聊天。,如果要實現群聊的話,只要把所有的socket儲存到集合中,有客戶輸入時遍歷socket得到輸出流並把訊息廣播給各個客戶端就行了。 四個讀寫的執行緒類都是一樣的,可以進行封裝,這裡就不封裝了。 Se

C#實現伺服器客戶之間通訊

TCP  套接字程式設計 伺服器端實現步驟: 1、使用Socket類建立套接字。 2、利用Bind方法將建立的套接字繫結到指定的地址結構。 3、利用Listen方法設定套接字為監聽模式,使得伺服器進入被動開啟狀態。 4、接受客戶端的連線請求。 5、接收、應答客戶端的資料請求

java實現伺服器客戶之間的檔案傳輸

實現思路 一、客戶端發文件:首先建立和伺服器的連線,然後我們通過IO流來實現資料的傳輸,步驟: 1、通過伺服器的IP地址和埠號實現和伺服器的連線(這裡不要忘記先開伺服器哦) 2、獲取本地的檔案的地址,建立java和檔案的連線。 3、獲取檔案輸入流和資料輸出流(注意:這裡的輸入和輸出都是指

最簡單的socket通訊伺服器客戶

底部附上了效果圖 伺服器程式碼: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java

關於httpserverlet實現伺服器客戶的互動

Servlet的框架是由兩個Java包組成:javax.servlet和javax.servlet.http. 在javax.servlet包中定義了所有的Servlet類都必須實現或擴充套件的的通用介面和類.在javax.servlet.http包中定義了採用HTTP通訊協議的HttpServlet類.

Java實現伺服器客戶簡單通訊

Java中網路程式設計這一塊有封裝的類庫,使用簡單,瞭解原理可以教容易實現伺服器和客戶端的簡單通訊。 在程式設計之前,首先要需要對TCP/IP協議有一定的瞭解,需要知道Socket套接字的作用以及用法,這個可以在API文件中去檢視。兩通訊實體之間通訊需要掌握資

csapp書上socket伺服器客戶的程式碼

客戶端的程式碼:  #include "csapp.h" int main(int argc, char **argv) { int clientfd, port; char *host, buf[MAXLINE]; rio_t rio; if (arg

python實現tcp伺服器客戶(socket)

python實現tcp伺服器和客戶端(socket) 1.socket模組 socket是什麼 socket最初是為了同一主機上的應用程式建立的,使得一個程式與另外一個程式之間可以通訊,也就是所謂的程序間通訊,有兩種型別的socket:基於檔案和麵向網路的。

【隨堂筆記】unity開發Socket的用法(一實現伺服器客戶簡單的連結)

實現了簡單的連結,也增加了客戶端沒有連結到伺服器的自動重連 伺服器程式碼 using System; using System.Net; using System.Net.Sockets; namespace SeverSocket { class Program

linux下用多執行緒實現socket伺服器客戶的非同步通訊

前面介紹了用select函式來實現socket的非同步收發資料,但是select函式也有一些缺陷,要使socket能持續地通訊,select必須不停地檢測,這樣程序就會一直阻塞在這裡,限制了功能的擴充套件,這裡我們用多執行緒的方式,另建立兩個執行緒用來發送/接收

Python實現udp協議的簡單伺服器客戶通訊

簡單socket程式在兩臺電腦之間傳輸訊息,分為客戶端和服務端,分別在兩臺電腦上執行後即可進行簡單的訊息傳輸,也可以在一臺電腦上測試,設定兩個不同的埠即可 以下是程式碼在一臺電腦上執行,開兩個終端即可

socket程式設計回射伺服器客戶

//回射伺服器 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet

實現socket的服務客戶通訊

對學習過程中自己敲的一些關於socket有關的程式碼做了個簡單總結,在這分享一下,給有需要的同學借鑑一下。 什麼是socket? 網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket。 建立網路通訊連線至少要一對埠號(socket)。socke

【Redis】Redis在Ubuntu伺服器客戶操作

伺服器端 伺服器端的命令為: redis-server 可以使用help檢視幫助文件 redis-server --help 個人習慣 ps aux | grep redis   # 檢視redis伺服器程序 sudo kill -9

ROS學習筆記19 (編寫簡單的伺服器客戶 (Python))

1 編寫服務端節點 我們會建立服務端節點 ("add_two_ints_server") ,節點接收兩個整型數字,並返回和 進入beginner_tutorials包 $ roscd beginner_tutorials 確保你確保已經在之前建立好AddTwoInts

簡單的TCP 流式socket 伺服器客戶程式碼示例

電子書在這裡,見6.8.1 和6.8.2 章節,書中的程式碼有很多錯誤,包括#include、socket 描述符賦值等,正確的程式碼在這裡 Server 程式碼: #include <stdio.h> #include <stdlib.h> #in