2

I am making server-client communication in python using sockets and threading module. I connect client to server, send some data, receive some data, but the problem is, I can send only two messages. After those, the server is not reciving my packets. Can someone tell me what's wrong? Thanks in advance.

Server.py:

import socket
from threading import Thread


class Server:
    def __init__(self):
        self.host = '127.0.0.1'
        self.port = 9999
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind((self.host, self.port))
        self.server.listen(5)
        self.threads = []

        self.listen_for_clients()

    def listen_for_clients(self):
        print('Listening...')
        while True:
            client, addr = self.server.accept()
            print('Accepted Connection from: '+str(addr[0])+':'+str(addr[1]))
            self.threads.append(Thread(target=self.handle_client, args=(client, addr)))
            for thread in self.threads:
                thread.start()

    def handle_client(self, client_socket, address):
        client_socket.send('Welcome to server'.encode())
        size = 1024
        while True:
            message = client_socket.recv(size)
            if message.decode() == 'q^':
                print('Received request for exit from: '+str(address[0])+':'+str(address[1]))
                break
            else:
                print('Received: '+message.decode()+' from: '+str(address[0])+':'+str(address[1]))

        client_socket.send('Received request for exit. Deleted from server threads'.encode())
        client_socket.close()

if __name__=="__main__":
    main = Server()

Client.py

import socket
import sys, time

def main():
    target_host = '127.0.0.1'
    target_port = 9999

    try:
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    except socket.error:
        print('Could not create a socket')
        time.sleep(1)
        sys.exit()

    try:
        client.connect((target_host, target_port))
    except socket.error:
        print('Could not connect to server')
        time.sleep(1)
        sys.exit()

    while True:
        data = input()
        client.send(data.encode())
        message = client.recv(4096)
        print('[+] Received: '+ message.decode())

main()
3
  • 2
    for thread in self.threads: does start threads in self.threads every time server does get a connection from a client. It is not what you want. Commented Nov 29, 2017 at 23:01
  • 1
    Use this: Thread(target=self.handle_client, args=(client, addr)).start(). Commented Nov 29, 2017 at 23:03
  • @xaav I used it eariel, hoped that for loop can change something. Commented Nov 29, 2017 at 23:23

1 Answer 1

1

You have to send exit message 'q^' to client too to close client.

Warning: Using Unicode as encoding for string is not recommended in socket. A partial Unicode character may be received in server/client resulting in UnicodeDecodeError being raised.

Code for server using threads is:

server.py:

import socket
from threading import Thread


class Server:
    def __init__(self, host, port):
        self.host = host
        self.port = port
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.bind((self.host, self.port))
        self.server.listen(5)

    def listen_for_clients(self):
        print('Listening...')
        while True:
            client, addr = self.server.accept()
            print(
                'Accepted Connection from: ' + str(addr[0]) + ':' + str(addr[1])
            )
            Thread(target=self.handle_client, args=(client, addr)).start()

    def handle_client(self, client_socket, address):
        size = 1024
        while True:
            try:
                data = client_socket.recv(size)
                if 'q^' in data.decode():    
                    print('Received request for exit from: ' + str(
                        address[0]) + ':' + str(address[1]))
                    break

                else:
                    # send getting after receiving from client
                    client_socket.sendall('Welcome to server'.encode())

                    print('Received: ' + data.decode() + ' from: ' + str(
                        address[0]) + ':' + str(address[1]))

            except socket.error:
                client_socket.close()
                return False

        client_socket.sendall(
            'Received request for exit. Deleted from server threads'.encode()
        )

        # send quit message to client too
        client_socket.sendall(
            'q^'.encode()
        )
        client_socket.close()


if __name__ == "__main__":
    host = '127.0.0.1'
    port = 9999
    main = Server(host, port)
    # start listening for clients
    main.listen_for_clients()

client.py:

import socket
import sys, time


def main():
    target_host = '127.0.0.1'
    target_port = 9999

    try:
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    except socket.error:
        print('Could not create a socket')
        time.sleep(1)
        sys.exit()

    try:
        client.connect((target_host, target_port))
    except socket.error:
        print('Could not connect to server')
        time.sleep(1)
        sys.exit()

    online = True
    while online:
        data = input()
        client.sendall(data.encode())
        while True:
            message = client.recv(4096)
            if 'q^' in message.decode():
                client.close()
                online = False
                break

            print('[+] Received: ' + message.decode())
            break  # stop receiving


# start client
main()
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

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.