socketserver an alle clients senden?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
hein_bloed
User
Beiträge: 1
Registriert: Sonntag 11. September 2016, 16:01

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:])
Zuletzt geändert von Anonymous am Sonntag 11. September 2016, 19:42, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Antworten