bin dabei mir eine kleine server/client anwendung zu schreiben die für mich das clipboard über das netzwerk sendet. da ich öfters auf zwei system unterwegs bin (win7 und mintlinux) und öfters mal den zwischenspeicher von den anderen brauche soll es so gelöst werden.
der server ansicht läuft ganz gut, es stellt sich aber die frage wie kann ich daten an alle clients senden. vllt weiß wer rat bei dem folgenden code:
Code: Alles auswählen
#!/usr/bin/python3
import socketserver, socket, sys, os, time
from threading import Thread
BUFF = 2056
HOST = ""
PORT = 23532
_CLB = ""
CONLIST = []
class EchoRequestHandler(socketserver.BaseRequestHandler):
def handle(self):
data = self.request.recv(BUFF).decode("utf-8").strip() #client meldet sich
print("New Connection from: {}:{}".format(self.client_address[0], self.client_address[1]))
if data != "Ping":
self.request.send("bad guy".encode("utf-8"))
self.request.close()
else:
data = "Pong"
self.request.send(data.encode("utf-8")) #sende antwort zum client
data = self.request.recv(BUFF).decode("utf-8").strip() #naechste antwort vom client
if data != "OK":
self.request.send("bad GUY".encode("utf-8"))
self.request.close()
else:
data = "Connected"
self.request.send(data.encode("utf-8")) #verbindung bestaetigen
print("Client Connected: {}:{}".format(self.client_address[0], self.client_address[1]))
CONLIST.append(self.request)
print(CONLIST)
while 1:
data = self.request.recv(BUFF).decode("utf-8").strip() #auf clibboard vom client warten/prüfen
if ifexist(data):
reply = data
print("Got Data: {} \nfrom: {}:{}\n".format(reply, self.client_address[0], self.client_address[1]))
wglobal(reply)
for c in CONLIST: #versuch die daten an alle clients zu senden
c.sendall(reply.encode("utf-8")) #versuch die daten an alle clients zu senden
print("send: {} to {}:{}".format(reply, self.client_address[0], self.client_address[1]))
else:
break
print("\nClient: {} left!\n".format(self.client_address[0]))
CONLIST.remove(self.request)
self.request.close()
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass
#exist entry?
def ifexist(clb):
if not _CLB == clb:
return 1
else:
return 0
#write global for store last clibboard entry
def wglobal(gl):
global _CLB
_CLB = gl
def main(argv):
server = ThreadedTCPServer((HOST, PORT), EchoRequestHandler)
print("Server started on: {}:{}".format(server.server_address[0], server.server_address[1]))
print("Listen....\n")
t = Thread(target=server.serve_forever())
t.thread.daemon = true
t.start()
server.socket.close()
if __name__ == "__main__":
main(sys.argv[1:])