When I try to receive larger amounts of data it gets cut off and I have to press enter to get the rest of the data. At first I was able to increase it a little bit but it still won't receive all of it. As you can see I have increased the buffer on the conn.recv() but it still doesn't get all of the data. It cuts it off at a certain point. I have to press enter on my raw_input in order to receive the rest of the data. Is there anyway I can get all of the data at once? Here's the code.
port = 7777
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('0.0.0.0', port))
sock.listen(1)
print ("Listening on port: "+str(port))
while 1:
conn, sock_addr = sock.accept()
print "accepted connection from", sock_addr
while 1:
command = raw_input('shell> ')
conn.send(command)
data = conn.recv(8000)
if not data: break
print data,
conn.close()
The accepted answer is fine but it will be really slow with big files -string is an immutable class this means more objects are created every time you use the
+
sign, usinglist
as a stack structure will be more efficient.This should work better
You can use it as:
data = recvall(sock)
Modifying Adam Rosenfield's code:
I would, however, heavily encourage using the original approach.
A variation using a generator function (which I consider more pythonic):
You can do it using Serialization
NOTE: If you want to shara a file using code above you need to encode / decode it into base64
TCP/IP is a stream-based protocol, not a message-based protocol. There's no guarantee that every
send()
call by one peer results in a singlerecv()
call by the other peer receiving the exact data sent—it might receive the data piece-meal, split across multiplerecv()
calls, due to packet fragmentation.You need to define your own message-based protocol on top of TCP in order to differentiate message boundaries. Then, to read a message, you continue to call
recv()
until you've read an entire message or an error occurs.One simple way of sending a message is to prefix each message with its length. Then to read a message, you first read the length, then you read that many bytes. Here's how you might do that:
Then you can use the
send_msg
andrecv_msg
functions to send and receive whole messages, and they won't have any problems with packets being split or coalesced on the network level.