Da ich neu hier bin, erstmal etwas zu mir, bzw. meiner Arbeitsumgebung:
-Ubuntu(Kernel 2.6.39.4)
-Programmiere unter IDLE (using Python-3.1)
-Habe python 2.6.5 und python 3.1.2 installiert (wenn ich was ausführe wird 2.6.5 benutzt)
Lerne mit:
-Galileo Openbook "Python das umfassende Handbuch"
Link zum Openbook: http://openbook.galileocomputing.de/python/
-O'Reillys Taschenbuch "Python kurz und gut" << Geschenk vom Bekannten
Bin sehr motiviert mich intensiv mit Python(nebst Linux[z.Z LPIC1]) zu beschäftigen,weil:
-Mich als Programmieranfänger C ziemlich frustriert hat...
-Mich ein "älterer" Bekannter (48 Jahre ,Fach-Informatiker) dazu bewegt hat
-Ich gerne meine (hoffentlich bald "guten") Scripts auch der breiten Masse
zur Verfügung stellen will (I <3 Open Source
-Ich sehr gerne hier im Forum selbst Hilfe anbieten will
-Mir Python einfach (die genauen Gründe würden wohl die wenigsten
interessieren...) sehr gefällt
Falls jemand mehr (hoffe das war nicht zuviel...) Informationen braucht, ich werd sie gerne geben...
Im Openbook wird ein einfaches Chat Programm (Socket-Methode, tcp) vorgestellt (was nicht wirklich brauchbar ist...). Anschliessend wird dem Leser die "Herausforderung" gestellt, das Programm mit Threads zu etwas Brauchbarem (ich will auch mehrere Nachrichten nacheinander schreiben/empfangen können, (ob sich die Ausgabe/Eingabe kreuzen ist mir noch egal)) zu erweiteren, was ich gerade versuche (habe auch das Kapitel zum Modul threading gelesen).
Ich krieg das leider noch nicht so recht hin Habe erst das Client Programm erweitert. Ist wahrscheinlich ziemlicher Murks, es funktioniert aber teilweise (der Client emfängt nix, kann aber schreiben). Die Funktion zum beenden ("if message == "exit") wird folgendermassen quittiert:
traceback (most recent call last):
File "./test_thread.py", line 38, in <module>
answer = client_socket.recv(1024)
File "/usr/lib/python2.6/socket.py", line 165, in _dummy
raise error(EBADF, 'Bad file descriptor')
socket.error: [Errno 9] Bad file descriptor
Habe das (Fehler bei der beenden Funktion) nur zur Vervollständigung gepostet, da es sich anscheinend um ein anderes Problem handelt (ist für mich z.Z. auch nicht so wichtig, Erklärungen würden trotzdem gern gesehen =)).
Der Server(unverändert), verhält sich wie erwartet (erst schreiben, dann empfangen usw...).
Hier nun die Codes:
Client:
Code: Alles auswählen
import socket
import threading
ip = raw_input("Enter IP: ")
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((ip, 666))
class SendThread(threading.Thread):
def __init__(self,message):
threading.Thread.__init__(self)
self.Message = message
class RecvThread(threading.Thread):
def __init__(self,answer):
threading.Thread.__init__(self)
self.Answer = answer
my_threads = []
try:
while True:
message = raw_input("Message: ")
client_socket.send(message)
if message == "exit":
break
thread_send = SendThread(str(message))
my_threads.append(thread_send)
thread_send.start()
finally:
client_socket.close()
try:
while 1:
answer = client_socket.recv(1024)
print "[%s] tells you: %s" % (ip, answer)
thread_recv = RecvThread(str(answer))
my_threads.append(thread_recv)
thread_recv.start()
finally:
for t in my_threads:
t.join()
Server:
Code: Alles auswählen
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("", 666))
try:
while True:
commun, addr = server_socket.accept()
while True:
data = commun.recv(1024)
if not data:
commun.close()
break
print "[%s] %s " % (addr[0], data)
message = raw_input("Enter your Message: ")
commun.send(message)
finally:
server_socket.close()
Ich hoffe habe alles richtig gemacht (ist ja mein allererster Forum-Post) und dass mir jemand die Richtung weisen kann (d.h. etwas zwischen "benutz Google" und dem fertigen Code!)
Hab mir mit diesem Post sehr Mühe gegeben nicht in die Kategorie "Ich will!!! Gebt mir!!!" zu gehören(will ja was lernen), deshalb wäre ich echt dankbar für brauchbare Antworten. Wie gesagt ich werde mich, sobald ich "etwas auf'm Kasten habe" auch bei der Community revanchieren!
MFG Lars alias PythonBytesMonty