python chat + socket

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
rogen

python chat + socket

Beitragvon rogen » Montag 20. Oktober 2003, 14:25

ich möchte einen python chat machen:
ich hab was im forum gefunden:

- der server

Code: Alles auswählen

#! /usr/local/bin/python

# Echo server program
import socket

HOST = '192.168.0.3'                 # Symbolic name meaning the local host
PORT = 50007             # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #erstellen Server
s.bind((HOST, PORT)) #server auf localhost, Port 50007 laufen lassen
s.listen(5) #Server maximal 1 Client akzeptieren lassen... warten...
conn, addr = s.accept() #Client hat den server angerufen, verbindung in conn, addresse des clients in addr
print 'Connected by', addr
while 1:
    data = conn.recv(1033)
    if not data: break
    conn.send(data) #Daten von Server zu Client senden
    print data
conn.close()





---------------------------------------------------------client ----------------

Code: Alles auswählen

from Tkinter import *


# Echo client program
import socket

class chat:
   def __init__(self):   
      HOST = '192.168.0.3'    # The remote host
      PORT = 50007         # The same port as used by the server
      self.chatter = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #socket-Obj erstellen
      self.chatter.connect((HOST, PORT)) #zu server verbinden
   
   def senden(self,inhalt):
      self.chatter.send(inhalt) #Daten zu server senden
   
   def empfangen(self):
      self.data = self.chatter.recv(1033) #Daten von Server empfangen
      return self.data
      self.chatter.close()


def inserttext(event):
   print "-------"
   ch.senden(EntryEing.get())
   
   stri = ch.empfangen()
   print stri
   
   print "-----stri-----"
   
   text.insert("end",stri + "\n")
   text.see(END)
   
   


root = Tk()
ch = chat()


scroll = Scrollbar(root)
scroll.place(x=200,y= 0,width=200)

text = Text(root,yscrollcommand=scroll.set)
text.place(x=0,y=10,width=200,height=250)

scroll.config(command=text.yview)

EntryEing  = Entry(root)
EntryEing.place(x=0,y= 280,width=200)
EntryEing.bind("<Return>",inserttext)



root.minsize(230,300)
mainloop()


ich kann ein client programm benützen wenn ich aber mehr als eine chat client
funktionierts nicht.

was kann man da machen ?

mfg
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Montag 20. Oktober 2003, 15:59

Der Schlüssel steht hierdrin:

Code: Alles auswählen

s.listen(5) #Server maximal 1 Client akzeptieren lassen... warten...


Mit listen(5) lässt du den Server auf maximal 5 Verbindungen warten (nicht eine, wie im Kommentar steht), behandelst aber im darunter liegenden Code nur 1 Verbindung. Das heißt, du müsstest noch mehr Verbindungen anlaufen lassen und jeden Text, der vom Server empfangen wird an jeden Client senden. Ich hab keine Ahnung wie das genau praktisch aussieht. Schuss ins blaue: einen Thread starten, der verbindungen aufnimmt und in eine Liste schreibt und einen anderen Programmteil, dass an jede Verbindung in der Liste die empfangenen Daten sendet...
rogen

jo

Beitragvon rogen » Montag 20. Oktober 2003, 16:17

ja genau das hat halb funktioniert.
jetzt kann ich mehrere chats starten leider aber jeder chatter mit sich selbst.
jetzt muss noch denem chatter alle infos schicken



Code: Alles auswählen

#! /usr/local/bin/python

# Echo server program
import socket, thread

HOST = '192.168.0.3'                 # Symbolic name meaning the local host
PORT = 50007           # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #erstellen Server
s.bind((HOST, PORT)) #server auf localhost, Port 50007 laufen lassen
s.listen(5) #Server maximal 1 Client akzeptieren lassen... warten...


def handclient(conn,addr):
   while 1:
       data = conn.recv(1033)
       if not data: break
       conn.send(data) #Daten von Server zu Client senden
       print data
       print addr
       print conn
   conn.close()


def starter():
   while 1:
      conn, addr = s.accept()
      thread.start_new(handclient,(conn,addr))


starter()
[/quote]
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Beitragvon murph » Sonntag 30. April 2006, 02:05

Wo liegt das Problem, wenn bei s.bind (Zeile 9)
File "./chatserver.py", line 9, in ?
s.bind((HOST, PORT)) #server auf localhost, Port 6666 laufen lassen
File "<string>", line 1, in bind
socket.error: (99, 'Cannot assign requested address')

Oder kann man diesen Skript gar nicht für das Internet benutzen?
nbkr
User
Beiträge: 28
Registriert: Montag 30. Mai 2005, 11:32

Beitragvon nbkr » Sonntag 30. April 2006, 11:50

Das Problem liegt daran, dass für jeden Chater ein Thread gestartet wird, die Daten aus den einzelnen Threads den anderen aber nicht zugänglich gemacht werden. D.h. Du musst zusehen dass es eine zentrale Stelle gibt an welcher sich die Threads anmelden und so Daten zu diesen geschickt werden können.

Prinzipiell sollte sich das Script auch im Internet verwenden lassen.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder