Skip to content Skip to sidebar Skip to footer

Basic Python Socket Server Application Doesnt Result In Expected Output

Im trying to write a basic server / client application in python, where the clients sends the numbers 1-15 to the server, and the server prints it on the server side console. Code

Solution 1:

Before entering the main loop on the server side, you accept a connection:

connection, address = s.accept()

But then in the loop itself you begin by accepting a connection:

whileTrue:
    connection, address = s.accept()
    buf = connection.recv(64)
    print buf

As a result, you never read from the first connection. That's why you don't see any output.

Note also that it's wrong (for what you're trying to do) to accept a new connection on every iteration. Even if you keep making new client connections, the server will accept a connection on each iteration and read from the socket once, but then continue the next iteration and wait for a new connection, never reading more data sent by a client. You should be making multiple recv calls on the same connection object instead.

You might find this tutorial helpful.

Solution 2:

There are multiple errors:

  • socket.send() might send only partial content, use socket.sendall() instead
  • format(12) returns '12' therefore even if your code sends all numbers and the server correctly receives them then it sees '01234567891011121314' i.e., individual numbers are not separated
  • double socket.accept() mentioned by @Alp leads to ignoring the very first connection
  • socket.recv(64) may return less than 64 bytes, you need a loop until it returns an empty bytestring (meaning EOF) or use socket.makefile()

Client:

#!/usr/bin/env python"""Send numbers in the range 0..14 inclusive as bytes e.g., 10 -> b'\n'

Usage: python client.py [port]
"""import sys
import socket
from contextlib import closing

port = 8686iflen(sys.argv) < 2elseint(sys.argv[1])
with closing(socket.create_connection(('localhost', port))) as sock:
    sock.sendall(bytearray(range(15))) # send each number as a byte
    sock.shutdown(socket.SHUT_RDWR)    # no more sends/receives

You need to know how numbers are separated in the data. In this case, a fixed format is used: each number is a separate byte. It is limited to numbers that are less than 256.

And the corresponding server:

#!/usr/bin/env python"""
Usage: python server.py [port]
"""from __future__ import print_function
import sys
import socket
from contextlib import closing

host = 'localhost'
port = 8686iflen(sys.argv) < 2elseint(sys.argv[1])

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # ipv4 versiontry:
    s.bind((host, port))
    s.listen(5)
    print("listening TCP on {host} port {port}".format(**vars()))
    whileTrue:
        conn, addr = s.accept()
        with closing(conn), closing(conn.makefile('rb')) as file:
            for byte initer(lambda: file.read(1), b''):
                # print numerical value of the byte as a decimal numberprint(ord(byte), end=' ')
            print("") # received all input from the client, print a newlineexcept KeyboardInterrupt:
    print('Keyboard interrupt received, exiting.')
finally:
    s.close()

Post a Comment for "Basic Python Socket Server Application Doesnt Result In Expected Output"