probiere mich aktuell an TCP-Verbindungen. Leider bekomme ich immer ein Timeout auf Client-Seite. Offenbar wartet der noch auf eine Antwort vom Server nur wie kann ich das beheben?
Danke schon mal. Verbesserungsvorschläge nehme ich ebenfalls gerne entgegen.
Klasse und Client:
Code: Alles auswählen
__author__ = 'lukas'
from socket import socket, AF_INET, SOCK_STREAM
class tcp_client():
def __init__(self, target, port, timeout=5, buffer_size=1024):
self.tcpdata = {'target': target, 'port': int(port), 'buffer_size': int(buffer_size), 'timeout': int(timeout)}
self.sock = socket(AF_INET, SOCK_STREAM)
self.sock.settimeout(self.tcpdata['timeout'])
self.init_connection()
def init_connection(self):
self.sock.connect((self.tcpdata['target'], self.tcpdata['port']))
def set_target(self, target):
self.tcpdata['target'] = target
self.init_connection()
def set_port(self, port):
self.tcpdata['port'] = port
self.init_connection()
def send(self, msg):
try:
if msg == 'request: database':
self.sock.send(msg.encode())
with open('./temp/dbdump', 'wb') as file:
data = self.sock.recv(self.tcpdata['buffer_size'])
while True:
file.write(data)
data = self.sock.recv(self.tcpdata['buffer_size'])
return './temp/dbdump'
else:
self.sock.send(msg.encode())
data = self.sock.recv(self.tcpdata['buffer_size'])
return data
except Exception as e:
exit(e)
def close(self):
self.sock.close()
class tcp_server():
def __init__(self, database, port, buffer_size=1024):
self.tcpdata = {'database': database, 'port': port, 'buffer_size': buffer_size}
def wait(self):
try:
sock = socket(AF_INET, SOCK_STREAM)
sock.bind(('127.0.0.1', self.tcpdata['port']))
sock.listen(5)
conn, addr = sock.accept() # accept incoming connections
self.tcpdata['database'].load() # reload database
if addr[0] in [s.get_ip() for s in self.tcpdata['database'].get_server()]: # ip in server-list
while True:
data = conn.recv(self.tcpdata['buffer_size']).decode("utf-8")
print('incoming data: ' + data)
if not data:
print('--CLOSE--')
sock.close()
conn.close()
break
else:
msg = 'unknown message'
if data == 'request: database':
with open(self.tcpdata['database'].confpath, 'rb') as dbfile:
buf = dbfile.read(self.tcpdata['buffer_size'])
while buf:
conn.send(buf)
buf = dbfile.read(self.tcpdata['buffer_size'])
elif data.startswith('request'):
msg = 'reply: unknown request'
conn.send(msg.encode())
else:
conn.send(b'unauthorized connection')
sock.close()
conn.close()
except Exception as e:
try:
sock.close()
conn.close()
except:
pass
exit(e)
if __name__ == '__main__':
c = tcp_client('127.0.0.1', 7777)
print(c.send('request: database'))
c.close()
Code: Alles auswählen
import dbfunctions
import tcp_communication
db = dbfunctions.db('meshpi.json.conf')
srv = tcp_communication.tcp_server(db, 7777)
while 1:
srv.wait()
Die Datei wird komplett übertragen, danach erst bricht die Verbindung ab.