ソケットを介して接続を受け取り、pngファイルを保存するpythonでテストサーバーを作成しました。しかし、ファイルの名前、それを送信したユーザーなど、他のデータをサーバーに渡したいのですが、データを受信するには、バッファで読み取っているバイト数を通知する必要があるため、これはできません。
構造体を使用してすべてのデータをパックする例がいくつかありますが、画像ごとにサイズが異なり、受け取るファイルごとに異なるため、単純に構造体形式を作成することはできません。
これは私がこれまで取り組んできたことです:
サーバ
import socket
import os
import sys
FilePath = os.path.realpath(os.path.dirname(sys.argv[0]))
s = socket.socket()
s.bind(("localhost",8000))
s.listen(5) #Tipo, 5 conexoes no maximo {ao mesmo tempo}
i=0
name = 'file_'
while (True):
sc, address = s.accept()
name = 'file_%s' % i
f = open(os.path.join(FilePath,'server_received/%s.png'% name) ,'wb') #open as binary data
i=i+1
# receives and writes the file
l = sc.recv(1024)
while (l):
f.write(l)
l = sc.recv(1024)
f.close()
sc.close()
s.close()
クライアント
class SendToServer(Thread):
def __init__(self, queue, *args, **kwargs):
Thread.__init__(self)
self.queue = queue
self.args = args
self.kwargs = kwargs
def run(self):
try:
while not self.queue.empty():
s = socket.socket()
s.connect((HOST,PORT))
file_path = self.queue.get()
file = open(file_path,'rb')
s.send(file_path)
l = file.read(1024)
while l:
s.send(l)
l = file.read(1024)
self.queue.task_done()
s.close()
print u"Enviado"
except:
print u"Sem conexao"
#This i Use when I call the Thread:
sync= SendToServer(queue)
sync.run()
上記のコードはうまく機能していますが、ファイル以外のデータを送信するにはどうすればよいですか? (バイナリデータ)