ranger101
ranger101

Reputation: 1194

Python TCP programming

I am having a tcp server and a client written in python. The aim of the programs is that the server will be sending some numbers one after the other to the client and the client should process each one of the number in a separate thread. The server loops over the number list and sends each one of them to client. as:

for num in nums:
    client_sock.send(str(num))

and the client loop as:

while True:
    data = tcpClientSock.recv(BUFSIZE)
    thread.start_new_thread( startFunction, (data, ) )

The problem is even though the server sends the program in separate send() call the client receives it all at once.

How can I avoid it? Should I use UDP instead of TCP in this situation?

Upvotes: 1

Views: 137

Answers (2)

Joel Cunningham
Joel Cunningham

Reputation: 671

TCP is a stream based protocol and not message based. This means there are no message boundaries for each time the server calls send(). In fact, each time send() is called, the bytes of data are just added to the stream.

On the receiving end, you'll receive bytes of the stream as they arrive. Since there are no message boundaries, you may receive part of a message or whole messages or whole + part of the next message.

In order to send message over a TCP stream, your protocol needs to establish message boundaries. This allows the receiver to interpret whether it has received a partial, full, or multiple messages.

In your example, the server is sending strings. The string termination servers as the message boundary. On the receiving side, you should be parsing out the strings and have handling for receiving partial strings

Upvotes: 0

KevinDTimm
KevinDTimm

Reputation: 14376

you'll have to flush the socket on the sending end - add a CR/NL to do so (since you're sending a string)

Upvotes: 2

Related Questions