Problem mit clientsocket.recv

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Sn4ke
User
Beiträge: 2
Registriert: Montag 17. Januar 2011, 20:31

Guten Abend :)

Also erstmal ich heisse Sn4ke und bin neu in diesem Forum...

Folgendes Problem:

Ich bin allgemein ein Python Anfänger...
Ich hab nachdem ich paar Projekte mit Python (+Pygame) gemacht habe, angefangen
mich mit Sockets zu beschäftigen. Meine Idee war es einen kleinen Chat zu schreiben.
Allerdings sollen sich dort mehrere Clients drauf verbinden können + alle können etwas schreiben.
Jetzt ist mein Problem die Funktion recieve(), diese würde eigentlich funktionieren wenn dieses
data = clientsockets.recv(1024).decode("ascii") nicht solange warten würde bis es Daten bekommt.

Also: Wie kann ich das verhindern?


Wichtig: Ja, es stimmt das die data nur ausgegeben wird. Das ist auch nur zu Testzwecken dort,
später werde ich diese an die einzelnen Clients versenden.

Hier ist der Code vom Server:

Code: Alles auswählen


import socket,threading

print ("Starting Chat Sever...")
serverport = input("Give me a Port: ")


welcometext = "Welcome to the Sn4ke's Chat Server!"
global clientsockets 
clientsockets= []


def recieve():  
   while True:
     if len(clientsockets) != 0:
      for i in range(0,len(clientsockets)):  
       data = clientsockets[i].recv(1024).decode("ascii")
       if not data: break
       print(data) 

       
def newconnect():
 while True:
   clientsocket,addr = serversocket.accept()
   print("IP: " + "["+addr[0]+"] "  + " connected successfully!")
   clientsocket.send(bytes(welcometext ,"ascii"))
   clientsockets.append(clientsocket)
  
try:
 serverport = int(serverport)
 global serversocket
 serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 serversocket.bind((socket.gethostname(),serverport))
 serversocket.listen(5)
 thread1 = threading.Thread(target=newconnect)
 thread2 = threading.Thread(target=recieve)
 thread1.start()
 thread2.start()
 print ("Server ist nun Online!")
 
except:
 print("Error")
Ja, ich weiss mein Programmierstyle ist nicht der beliebteste :lol:
Den Code vom Client brauche ich hier nicht zu posten, der funktioniert tadellos.

Ps: Wenn ihr den Thread nicht versteht, bitte sagen bin bissel minimalistisch im Moment :D

Danke an alle Antworten

Mit freundlichen Grüssen

Sn4ke :mrgreen:
BlackJack

@Sn4ke: Die Antwort auf die Frage dürfte im `select`-Modul liegen.

An dem Stil solltest Du aber dringend arbeiten. Code ausser Definitionen von "Konstanten" gehört nicht auf Modulebene und die Existenz von ``global`` solltest Du ganz schnell vergessen. Zumal keine ``global``-Anweisungen in dem Beispiel einen Effekt hat -- die kannst Du weglassen.

Die Einrückung sollte vier Leerzeichen pro Ebene sein.
Sn4ke
User
Beiträge: 2
Registriert: Montag 17. Januar 2011, 20:31

Vielen Dank für die Antwort BlackJack...!
Ich werde mir das Select Modul genauer anschauen.
Und meinen Programmierstyle changen :mrgreen:

Mit freundlichen Grüssen,

Sn4ke :mrgreen:
Bennhardt
User
Beiträge: 15
Registriert: Donnerstag 9. Februar 2006, 14:21
Wohnort: Buchholz in der Nordheide

Bin zufällig hierrüber gestolpert:

http://www.hib-wien.at/leute/wurban/inf ... Server.pdf

Vielleicht hilfts oder gibt Ideen.
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

Cooler Code! Zwar ein bisschen schlampig, aber wie du das mit Threads gemacht hast, ist cool. Der empfängt und wartet auf neue Verbindungen gleichzeitig! Krass.

BlackJack muss ich recht geben! "global" ist nicht nötig. Dein "clientsocket" ist global verfügbar, da es auf der ersten Ebene existiert und "serversocket" wird nur im try/except-Block gebraucht, darum kein "global"!

Ich habe eine Chat gesehen, da war der Code fast 1000 Zeilen lang, allein der Server, der Client war nochmal um die 500 Zeilen lang, na gut, wenns toll aussehen soll geht's ja noch. Dein ServerCode ist minimal und effektiv.

Du hast mir stunden Recherche erspart. Jetzt krieg ich das mit dem Chat für mein Webprojekt hin!
LG Maik
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bei einem Chat muss es ja imho auch nicht komplett low-level sein. Da kann man imho auch schön mit *RPC was machen. Wenn es einem nicht um das Erlernen von solchen low-level Sachen geht, würde ich da eine höhere Ebene vorziehen :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten