Seite 1 von 1

socketserver an alle clients senden?

Verfasst: Sonntag 11. September 2016, 17:50
von hein_bloed
hi zusammen,

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:])

Re: socketserver an alle clients senden?

Verfasst: Sonntag 11. September 2016, 19:17
von Sirius3
@hein_bloed: dass der Server an sich ganz gut läuft, ist eine leichte Übertreibung. recv arbeitet nicht so, wie Du hoffst. Dein Code muß auch zurecht kommen, wenn pro recv-Aufruf nur jeweils 1 Byte zurück kommt. Das "Protokoll", das Du verwendest, kommt mir etwas seltsam vor. Dein zusätzlicher Serverthread tut zum Glück nicht, denn sonst würde das Programm sofort wieder beendet.

Bevor Du anfängst, etwas selbst zu erfinden, such zuerst, ob es nicht schon etabliertes gibt, z.B. einen Message-Broker wie Rabbit-MQ.