Trying to Send Repeated Messages to a Server Using sockets

D

danfolkes

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',))
 
B

Bruno Desthuilliers

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()
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top