I need some help to make this simple program run [please, see the source code
below] as it's probably some basic misunderstanding. I'm trying to lay out the
principles of an elementary chat server with a fixed number of clients, and
I've been testing these two programs on my local network -- WiFi, no fire wall.
The client would be an iMac G5 running X.4.6 at 192.168.1.20 while the server
would be a PowerBook running X.3.9 at 192.168.1.129. That said, swapping the
machines doesn't solve anything.
The question is: why can't the client use the socket.connect function here?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The server runs with no glitch and cycles in its while-loop. Meanwhile, I
launch the client, but it quits on a sys.exit instruction, and the
socket.connect function doesn't return anything printable -- maybe because it
executes in a try-block?...
Here's the error I get:
$ python client.py jf
~~~ Name : jf - Host : 192.168.1.129 - Port : 5007
Connection failed - error : None
Any idea?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# -- source code
# -- server
from socket import *
import threading
import sys
def server (Host, Port):
global clients
S = socket (AF_INET, SOCK_STREAM)
try:
S.bind ((Host, Port))
except:
print "socket connection failed"
sys.exit ()
print "Host =", Host, "\nPort =", Port
print "Accepting new clients..."
S.listen (MAX)
while True:
C, A = S.accept ()
P = C.recv (10) # pseudonym
clients.append (C)
print "New client connected:", P, A
threading.Thread (target = dialog, args = (P, C)).start ()
def dialog (pseudo, socket):
help (socket)
while True:
CliMsg = socket.recv (BuffSize)
if (CliMsg == '/quit'):
SrvMsg = pseudo + ' = disconnected'
break
if (CliMsg == '/help'):
help (socket)
continue
SrvMsg = pseudo + ' = ' + CliMsg
print SrvMsg
for c in range (len (clients)):
clients[c].send (SrvMsg)
print SrvMsg
for c in range (len (clients)):
clients[c].send (SrvMsg)
for c in range (len (clients)):
if (clients[c] == socket):
del (clients[c])
socket.close ()
def help (socket):
help_text = "\n"
help_text += "type /help to display this again\n"
help_text += "type /quit to disconnect\n"
help_text += "press [quit] to quit\n"
socket.send (help_text)
clients = []
HOST = 'localhost'
PORT = 5007 # can't bind this for 2 successive runs
BuffSize = 1024
MAX = 5
if len (sys.argv) > 1:
if len (sys.argv) == 3:
HOST = sys.argv[1]
PORT = int (sys.argv[2])
else:
print "usage:", sys.argv[0], "<host> <port>"
sys.exit ()
threading.Thread (target = server, args = (HOST, PORT)).start ()
# -- client
import threading
import Tkinter
import sys
import tkSimpleDialog
import socket
def send_handler (event):
global NT
try:
CliMsg = NT.get ()
NT.delete (0, END)
socket.send (CliMsg)
except:
socket.close ()
sys.exit
def quit ():
try: socket.send ('/quit')
except: pass
root.destroy ()
root.quit ()
def setup (root, title):
global TF, NT
root.title (title)
TF = Text (root, width = 60, height = 20)
TF.grid (row = 0, column = 0, columnspan = 3)
SB = Scrollbar (root, orient = VERTICAL)
SB.config (command = TF.yview)
TF.config (yscrollcommand = SB.set)
SB.grid (row = 0, column = 3, sticky = N + S)
NT = Entry (root)
NT.grid (row = 1, column = 0, columnspan = 2, sticky = W + E)
NT.bind ("<Return>", send_handler)
NT.focus_set ()
QB = Button (root, text = 'quit', command = quit)
QB.grid (row = 1, column = 2)
def connect (Host, Port, P):
Sk = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
try:
Sk.socket.connect ((Host, Port))
except :
print "Connection failed..."
sys.exit ()
print "Connection successful @ ", Host , Port
Sk.socket.send (P)
return Sk
def listening (sock):
global TF
while True:
try:
SrvMsg = sock.recv (BuffSize)
if (SrvMsg):
TF.insert (END, SrvMsg + '\n')
except:
TF.insert (END, "not connected...\n")
print "Not connected..."
break
sock.close ()
# Application specific ~~~~~~~~~~~~~~~~~~~~~~~~
HOST = 'localhost'
HOST = '192.168.1.129' # my network only
PORT = 5007
BuffSize = 1024
P = None # pseudonym
if (len (sys.argv) > 1):
if (len (sys.argv) == 2):
P = sys.argv[1]
elif (len (sys.argv) == 3):
HOST = sys.argv[1]
PORT = int (sys.argv[2])
elif (len (sys.argv) == 4):
HOST = sys.argv[1]
PORT = int (sys.argv[2])
P = sys.argv[3]
else :
print "usage:", sys.argv[0], " [HOST PORT] [userName]"
sys.exit ()
while (not P):
P = tkSimpleDialog.askstring ('P', 'Pseudonym?...')
# remove this one
print "~~~ Client name:", P, "- Host:", HOST, "- Port:", PORT
socket = connect (HOST, PORT, P)
root = Tk ()
setup (root, "PyChAt @ " + P)
threading.Thread (target = listening, args = [socket]).start ()
root.mainloop ()
--
Jym Feat -- Paris FR 75018
_______________________________________________
Pythonmac-SIG maillist - [email protected]
http://mail.python.org/mailman/listinfo/pythonmac-sig