Trying to Send Repeated Messages to a Server Using sockets
Bruno Desthuilliers
bdesth.quelquechose at free.quelquepart.fr
Tue Oct 16 14:50:25 EDT 2007
danfolkes a écrit :
> Hey Everyone, I am trying to send repeated messages from a "Node" to a
> "Server". It works the first time I send the from the Node to Server,
> but after that it either errors, or does not do anything.
>
> I would love some help, here is the code:
Posting the trackbacks may have help too.
> import socket
> import thread
> import time
>
>
> def Node(nodeAddress):
pep08:
- function names should be all_lower. MixedCase is for class names.
- variable names should be all_lower
> '''connect to node and get its file load'''
>
> sN = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> # Echo client program
> HOST = nodeAddress # The remote host
> PORT = 50007 # The same port as used by the server
These two last lines are useless here. The second would be meaningful
outside the function's body. The first one looks like a constant, but is
only an alias for the nodeAddress param.
> sN = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
This discards the first socket instanciated above...
> sN.connect((HOST, PORT))
> sN.send('Hello, world')
> data = sN.recv(1024)
> sN.close()
> print 'Received', repr(data)
>
> def Server(address):
pep08 again.
> ''' starts a socket server and decides what to do with incomming
> stuff'''
> message = "hello from server"
> HOST = '' # Symbolic name meaning the local host
> PORT = 50007 # Arbitrary non-privileged port
Idem. But this time, you just don't use the 'address' param...
> sP = None
> sL = None
> sR = None
> sS = None
> sStor = 0
> sTotalStorage = 0
> sCT = (sP,)
None of those very badly named variables are used in the code.
> '''look in server.conf for connect_to_server value'''
>
> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
> s.bind((HOST, PORT))
> s.listen(1)
> conn, addr = s.accept()
Hem...
> print 'Connected by', addr
> while 1:
> print message
> time.sleep(1)
> data = conn.recv(1024)
> #if not data: break
> conn.send(data)
Your server loops forever on the first connection it got...
> conn.close()
>
> thread.start_new(Server,('',))
> thread.start_new(Node,('127.0.0.1',))
> while 1:
> time.sleep(5)
> thread.start_new(Node,('127.0.0.1',))
>
Here's a somewhat corrected version. I'm not sure it's an example to
follow wrt/ threaded server implementation (it's the first time I write
one myself), but at least it works.
import socket
import thread
import time
HOST = ''
PORT = 50007
def node(host, num):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, PORT))
print "node %s: sending" % num
s.send("node '%s' says : Hello, world" % num)
time.sleep(10) # play with this to see how the server reacts...
print "node %s: receiving" % num
data = s.recv(1024)
s.close()
print "node %s: received '%s'" % (num, data)
print "node %s: done" % num
def server(address):
thread_ids = []
def handle(conn, addr):
tid = thread.get_ident()
print "server (handle %s): handling connection for %s" % (tid,
str(addr))
print "server (handle %s): receiving" % tid
data = conn.recv(1024)
while data:
print "server (handle %s): got '%s'" % (tid, data)
print "server (handle %s): sending '%s'" % (tid, data)
conn.send(data)
time.sleep(2)
print "server (handle %s): receiving" % tid
data = conn.recv(1024)
print "server (handle %s): no more data for %s, closing" %
(tid, str(addr))
conn.close()
thread_ids.remove(tid)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(10)
while 1:
print "server: active handler threads : %s" % thread_ids
nb_handlers = len(thread_ids)
while nb_handlers > 10:
print "server: too much connections, waiting for current
handlers to terminate"
time.sleep(5)
nb_handlers = len(thread_ids)
print "server: accepting connections - actually %s handlers" %
nb_handlers
conn, addr = s.accept()
print "server: connected by", addr
print "server: starting a new handler thread for connection %s"
% nb_handlers
thread_ids.append(thread.start_new(handle, (conn, addr)))
time.sleep(1)
def main():
print "starting server..."
thread.start_new(server,('',))
num = 1
while 1:
time.sleep(1)
print "new node %s..." % num
thread.start_new(node,('127.0.0.1',num))
num += 1
if __name__ == '__main__':
main()
More information about the Python-list
mailing list