python chat + socket

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
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

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

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:

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

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