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()
asked Nov 29, 2017 at 22:26
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()
answered Dec 1, 2017 at 22:06
Sign up to request clarification or add additional context in comments.

Comments

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.