2017-05-22 11 views
0

イメージを変更してクライアントに送り返すコードをサーバーに送信しようとしました。イメージを長さ1024のチャンクで送信します。サーバー側でOpencvを使用してイメージを編集し、イメージをクライアントに送り返すことでした。しかし、私のクライアントコードは、画像を受信する直前に実行を停止します。私はこれが同期化の問題だと感じています。サーバが画像ファイルを作成する前に、クライアントはrecvを呼び出します(Client.py)。 私のサーバー側のコード:Pythonでのソケットプログラミングによる画像の送信と取得

from socket import * 

serverPort = 12000 
serverSocket = socket(AF_INET, SOCK_STREAM) 
serverSocket.bind(('', serverPort)) 
serverSocket.listen(1) 
print("Server is ready to service...") 

while 1: 
    connectionSocket, addr = serverSocket.accept() 
    res = '' 
    while 1: 
     t = connectionSocket.recv(1024) 
     if not t: 
      break 
     res += t 
    g = open("Client.jpg", "wb") 
    g.write(res) 
    g.close() 
    print("Image received and recreated") 


    f = open("Client.jpg", "rb") 
    #print(len(f)) 
    print("Sending image data...") 
    while 1: 
     print("In while") 
     #data = f.read(1024) 
     if not data: 
      break 
     connectionSocket.send(data) 
     print("Data sent:"+str(len(data))) 

    connectionSocket.close() 

クライアント側のコード:

from socket import * 
import time 

serverName = 'localhost' 
serverPort = 12000 

clientSocket = socket(AF_INET, SOCK_STREAM) 
clientSocket.connect((serverName, serverPort)) 

Image = open("BG.jpg", "rb") 

print("Sending image data...") 
while 1: 
    data = Image.read(1024) 
    if not data: 
     break 
    clientSocket.send(data) 
    #print(len(data)) 

print("Data has been sent!") 
print("-------------------") 
time.sleep(3) 
print("Receving data") 

res = '' 
while 1: 
    print("in while") 
    t = clientSocket.recv(1024) 
    print(len(t)) 
    if not t: 
     break 
    res += t 

g = open("Response.jpg", "wb") 
g.write(res) 
g.close() 

clientSocket.close() 

私は任意のより多くの情報を提供しなければならない場合は私に知らせてください。

両側の出力はそれほど大きくありません。クライアント側で 出力:サーバー側での

Sending image data... 
Data has been sent! 
------------------- 
Receving data 
in while 

出力:

Server is ready to service... 
Image received and recreated 
Sending image data... 
In while 

私はそれを中断する前に、約2分間のコードを実行させた後、これが出力されます。

+0

あなたもプログラムの出力を投稿できますか? –

+0

私はそうしました。 –

答えて

0

ソケットがシャットダウンまたはクローズされるまで、サーバはクライアントが終了する前に、あなたのコードがループの読み取りが含まれているため、Image received and recreatedを書くことができていたことが奇妙である:為替のようなものでは

while 1: 
    t = connectionSocket.recv(1024) 
    if not t: # t should be empty only when the socket is shut down or closed... 
     break 
    res += t 

サーバーは、クライアントがいつデータを送信し終えるかを知ることができません。それを言うにはプロトコルを使うべきです。たとえば、ファイルの長さとデータの長さを最初に送信すると、サーバーは正しいバイト数を受け取ったときに独自の処理を実行できることを知ります。

また、各側に1つの送信があるため、クライアントから最初に送信してからサーバーから送信するためにソケットをシャットダウンすることはできますが、通常は低い方で使用されるshutレベルでグレースフルシャットダウンを設定します。

関連する問題