Seite 1 von 1

Problem mit clientsocket.recv

Verfasst: Montag 17. Januar 2011, 20:55
von Sn4ke
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:

Re: Problem mit clientsocket.recv

Verfasst: Montag 17. Januar 2011, 21:10
von 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.

Re: Problem mit clientsocket.recv

Verfasst: Montag 17. Januar 2011, 21:31
von Sn4ke
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:

Re: Problem mit clientsocket.recv

Verfasst: Dienstag 8. Februar 2011, 13:08
von Bennhardt
Bin zufällig hierrüber gestolpert:

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

Vielleicht hilfts oder gibt Ideen.

Re: Problem mit clientsocket.recv

Verfasst: Donnerstag 10. Februar 2011, 22:46
von daemonTutorials
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!

Re: Problem mit clientsocket.recv

Verfasst: Freitag 11. Februar 2011, 19:06
von Hyperion
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 :-)