-1

У меня есть эта часть кода для обработки серверов. он правильно принимает данные, но когда я хочу отправлять полученные данные клиентам, ничего не происходит.сервер не отправляет данные клиентам

сервер

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() 
' 

Я хочу, если данные, полученные полностью отправить клиентам, получить адрес отправителя и отправить его другим клиентам с помощью conn.send(), но кажется, что нет никакого способа сделать это с 'send()'.

Кусок стороне клиента кода '

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) 
' 

метод приемник не получает каких-либо данных.

ответ

0

Я немного модифицировал ваш код (поскольку у меня есть python 2.7) и conn.send(), похоже, работает нормально. Вы также можете попробовать conn.sendall(). Вот код, я побежал: Код

Сервер: Код

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() 

Клиент:

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() 
Смежные вопросы