ファイルの内容(画像)を新しいファイルに正常にコピーできました。ただし、TCPソケットで同じことをしようとすると、問題に直面します。サーバーループは終了していません。クライアントループはEOFに達すると終了しますが、サーバーはEOFを認識できません。
コードは次のとおりです。
サーバー
import socket # Import socket module
s = socket.socket() # Create a socket object
Host = socket.gethostname() # Get local machine name
port = 12345 # Reserve a port for your service.
s.bind((Host, port)) # Bind to the port
f = open('torecv.png','wb')
s.listen(5) # Now wait for client connection.
while True:
c, addr = s.accept() # Establish connection with client.
print 'Got connection from', addr
print "Receiving..."
l = c.recv(1024)
while (l):
print "Receiving..."
f.write(l)
l = c.recv(1024)
f.close()
print "Done Receiving"
c.send('Thank you for connecting')
c.close() # Close the connection
クライアント
import socket # Import socket module
s = socket.socket() # Create a socket object
Host = socket.gethostname() # Get local machine name
port = 12345 # Reserve a port for your service.
s.connect((Host, port))
s.send("Hello server!")
f = open('tosend.png','rb')
print 'Sending...'
l = f.read(1024)
while (l):
print 'Sending...'
s.send(l)
l = f.read(1024)
f.close()
print "Done Sending"
print s.recv(1024)
s.close # Close the socket when done
スクリーンショットは次のとおりです。
サーバー
クライアント
編集1:余分なデータをコピーしました。ファイルを「不完全」にします。最初の列は、受信した画像を示しています。送信されたものよりも大きいようです。このため、画像を開くことができません。破損したファイルのようです。
編集2:これは私がコンソールでそれを行う方法です。ここでは、ファイルサイズは同じです。
クライアントは socket.shutdown
を使用して送信が終了したことを通知する必要があります(ソケットの読み取り/書き込みの両方の部分を閉じる socket.close
ではありません):
...
print "Done Sending"
s.shutdown(socket.SHUT_WR)
print s.recv(1024)
s.close()
UPDATE
クライアントはHello server!
をサーバーに送信します。サーバー側のファイルに書き込まれます。
s.send("Hello server!")
それを避けるために上記の行を削除してください。
以下のコードを削除
s.send("Hello server!")
s.send("Hello server!")
をサーバーに送信するため、出力ファイルのサイズがいくらか大きくなるためです。
サーバーでのwhileループを停止するためのフラグを送信できます
たとえば
import socket
s = socket.socket()
s.bind(("localhost", 5000))
s.listen(1)
c,a = s.accept()
filetodown = open("img.png", "wb")
while True:
print("Receiving....")
data = c.recv(1024)
if data == b"DONE":
print("Done Receiving.")
break
filetodown.write(data)
filetodown.close()
c.send("Thank you for connecting.")
c.shutdown(2)
c.close()
s.close()
#Done :)
import socket
s = socket.socket()
s.connect(("localhost", 5000))
filetosend = open("img.png", "rb")
data = filetosend.read(1024)
while data:
print("Sending...")
s.send(data)
data = filetosend.read(1024)
filetosend.close()
s.send(b"DONE")
print("Done Sending.")
print(s.recv(1024))
s.shutdown(2)
s.close()
#Done :)
問題は、server.pyが開始時に受け取る余分な13バイトです。これを解決するには、以下のようにwhileループの前に「l = c.recv(1024)」を2回書き込みます。
print "Receiving..."
l = c.recv(1024) #this receives 13 bytes which is corrupting the data
l = c.recv(1024) # Now actual data starts receiving
while (l):
これにより、さまざまな形式とサイズのファイルで試行した問題が解決されます。この先頭の13バイトが何を指しているのか誰にもわからない場合は、返信してください。
while True
内にファイルを置く
while True:
f = open('torecv.png','wb')
c, addr = s.accept() # Establish connection with client.
print 'Got connection from', addr
print "Receiving..."
l = c.recv(1024)
while (l):
print "Receiving..."
f.write(l)
l = c.recv(1024)
f.close()
print "Done Receiving"
c.send('Thank you for connecting')
c.close()
次のコードに従ってループ条件を変更できます。lの長さがバッファサイズよりも小さい場合は、ファイルの終わりに達したことを意味します
while (True):
print "Receiving..."
l = c.recv(1024)
f.write(l)
if len(l) < 1024:
break