3

I'm stuck on this socket communication, I've looked everywhere but I haven't found an answer yet.

THE PROBLEM: I can only send 1 message from the client before it either gives me an error or ends the script. I need to be able to send multiple messages to the server.

The server side (shown below) should be fine:

# Echo server program
import socket
import time
import os
#-----------------------------------------------------------------------------------------------------------------------
today = time.strftime('%Y.%m.%d')
logFileName = "log - " + today + ".txt"
HOST = '10.0.0.16' 
PORT = 8080 # Reserve a port for your service
BUFFER_SIZE = 1024 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Create a socket object
s.bind((HOST, PORT)) # Bind to the port
def print_write(text):
 log.write(time.strftime("%H:%M:%S") + " | " + text)
 log.write("\n")
 print text
#-----------------------------------------------------------------------------------------------------------------------
if os.path.isfile(logFileName) is True:
 log = open(logFileName, 'a+')
 print_write("[SERVER] Log for " + today + " already exists.")
 print_write("[SERVER] Starting comms")
else:
 print "[SERVER] Log doesn't exist"
 log = open(logFileName, 'a+') # Create file -> log - %date%.txt
 print_write("[SERVER] Log created")
while True:
 s.listen(1)
 conn, addr = s.accept()
 data = conn.recv(BUFFER_SIZE)
 if data == "Comms Shutdown":
 print_write("------ REMOTE SHUTDOWN ------")
 conn.close()
 raise SystemExit
 else:
 print_write("[COMMS] " + str(addr) + " says: " + data)
log.close()

Sorry if it's very messy and confusing but i don't have much time to finish this project, if you have any question just ask.

For the client side I don't have much but here, I'll give you this:

import socket
HOST = '10.0.0.16' # The remote host
PORT = 8080 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
 msg = raw_input()
 s.sendall(msg)
 print msg

I know it doesn't work, it's just to give you an idea of what I need.

Thank you in advance.

asked Jun 12, 2016 at 17:39
1
  • Your server code only calls recv one time before looping again, you should use a while loop or something like that to call recv multiple times before opening a new connection.. Commented Jun 12, 2016 at 17:57

1 Answer 1

4

The problem is, that you only read the first message from each open connection before moving on to the next. The accept() methods waits for a new connection and gives you the information needed when a new one comes in. the recv() method on the other hand, receives data from a existing connection and waits if there is none. If you want to receive multiple messages from a single client, you can just wait for the first connection and then wait for data with recv(). This could look like this:

s.listen(1)
conn, addr = s.accept()
while True:
 data = conn.recv(BUFFER_SIZE)
 if data == "Comms Shutdown":
 print_write("------ REMOTE SHUTDOWN ------")
 conn.close()
 raise SystemExit
 else:
 print_write("[COMMS] " + str(addr) + " says: " + data)

If you want to be able to also manage multiple clients, you will have to create a thread for each one from a while loop waiting for new connections. This is a bit more complicated:

def client_handler(conn):
 while True:
 data = conn.recv(BUFFER_SIZE)
 if data == "Comms Shutdown":
 print_write("------ REMOTE SHUTDOWN ------")
 conn.close()
 raise SystemExit 
 # this will kill the server (remove the line above if you don't want that)
 else:
 print_write("[COMMS] " + str(addr) + " says: " + data)
while True:
 s.listen(1)
 conn, addr = s.accept()
 recv_thread = threading.Thread(target=client_handler, args=(conn, ))
 recv_thread.start()

All this code is untested. Be aware, that I omitted the logging part and the socket creation part as well as all imports.

answered Jun 12, 2016 at 17:55
Sign up to request clarification or add additional context in comments.

1 Comment

Exactly what I was looking for! Great, thank you very much.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.