-1

I have this piece of code for server to handle clients. it properly receive data but when i want to send received data to clients nothing happens.

server

import socket
from _thread import *


class GameServer:

    def __init__(self):

        # Game parameters
        board = [None] * 9
        turn = 1

        # TCP parameters specifying
        self.tcp_ip = socket.gethostname()
        self.tcp_port = 9999
        self.buffer_size = 2048

        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        try:
            self.s.bind((self.tcp_ip, self.tcp_port))
        except:
            print("socket error, Please try again! ")

        self.s.listen(5)
        print('Waiting for a connection...')

    def messaging(self, conn):

        while True:
            data = conn.recv(self.buffer_size)
            if not data:
                break

            print("This data from client:", data)
            conn.send(data)

    def thread_run(self):
        while True:
            conn, addr = self.s.accept()
            print('connected to: ' + addr[0] + " : " + str(addr[1]))
            start_new_thread(self.messaging, (conn,))


def main():
    gameserver = GameServer()
    gameserver.thread_run()

if __name__ == '__main__':
    main()
'

I want to if data received completely send to clients by retrieve the address of sender and send it to other clients by means of conn.send() but seems there is no way to do this with 'send()' method.

The piece of client side code '

def receive_parser(self):
        global turn
        rcv_data = self.s.recv(4096)
        rcv_data.decode()
        if rcv_data[:2] == 'c2':
            message = rcv_data[2:]
            if message[:3] == 'trn':
                temp = message[3]
                if temp == 2:
                    turn = -1
                elif temp ==1:
                    turn = 1

            elif message[:3] == 'num':
                self.set_text(message[3])

            elif message[:3] == 'txt':
                self.plainTextEdit_4.appendPlainText('client1: ' + message[3:])
        else:
            print(rcv_data)
'

the receiver method does not receive any data.

Reza
  • 728
  • 1
  • 10
  • 28

1 Answers1

0

I modified your code a little(as I have python 2.7) and conn.send() seems to work fine. You can also try conn.sendall(). Here is the code I ran:

Server code:

import socket
from thread import *


class GameServer:

    def __init__(self):

        # Game parameters
        board = [None] * 9
        turn = 1

        # TCP parameters specifying
        self.tcp_ip = "127.0.0.1"#socket.gethostname()
        self.tcp_port = 9999
        self.buffer_size = 2048

        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        try:
            self.s.bind((self.tcp_ip, self.tcp_port))
        except:
            print("socket error, Please try again! ")

        self.s.listen(5)
        print('Waiting for a connection...')

    def messaging(self, conn):

        while True:
            data = conn.recv(self.buffer_size)
            if not data:
                break

            print("This data from client:", data)
            conn.send(data)

    def thread_run(self):
        while True:
            conn, addr = self.s.accept()
            print('connected to: ' + addr[0] + " : " + str(addr[1]))
            start_new_thread(self.messaging, (conn,))


def main():
    gameserver = GameServer()
    gameserver.thread_run()

main()

Client code:

import socket

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 9999))

def receive_parser():
        #global turn
    s.sendall("hello world")
    rcv_data = s.recv(4096)
        # rcv_data.decode()
        # if rcv_data[:2] == 'c2':
        #     message = rcv_data[2:]
        #     if message[:3] == 'trn':
        #         temp = message[3]
        #         if temp == 2:
        #             turn = -1
        #         elif temp ==1:
        #             turn = 1

        #     elif message[:3] == 'num':
        #         self.set_text(message[3])

        #     elif message[:3] == 'txt':
        #         self.plainTextEdit_4.appendPlainText('client1: ' + message[3:])
        # else:
    print(rcv_data)

receive_parser()
shiva
  • 2,535
  • 2
  • 18
  • 32