471,624 Members | 1,704 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,624 software developers and data experts.

Trying to Send Repeated Messages to a Server Using sockets

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:

import socket
import thread
import time
def Node(nodeAddress):

'''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
sN = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sN.connect((HOST, PORT))
sN.send('Hello, world')
data = sN.recv(1024)
sN.close()
print 'Received', repr(data)

def Server(address):

''' 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
sP = None
sL = None
sR = None
sS = None
sStor = 0
sTotalStorage = 0
sCT = (sP,)
'''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()
print 'Connected by', addr
while 1:
print message
time.sleep(1)
data = conn.recv(1024)
#if not data: break
conn.send(data)
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',))

Oct 16 '07 #1
1 2541
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()
Oct 16 '07 #2

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

11 posts views Thread by hazz | last post: by
7 posts views Thread by John Straumann | last post: by
1 post views Thread by XIAOLAOHU | last post: by
reply views Thread by leo001 | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.