Проблема программирования сокетов - Python - PullRequest
3 голосов
/ 05 февраля 2011

Хорошо, я потратил около трех часов на программирование сокетов в Python, пытаясь создать простую программу чата.Я получил клиент для отправки текста на сервер, а затем, с этого момента, клиент повторяет сообщение для себя.Однако я хочу, чтобы сообщение было отправлено на сервер, а затем сервер, а не клиент, повторно отправил его всем подключенным клиентам.У меня проблемы с этим.Это мой код:

Код на стороне сервера:

import SocketServer

    def handle(self):
        data = self.request[0].strip()
        socket = self.request[1]
        print "%s wrote:" % self.client_address[0]
        print data
        socket.sendto(data.upper(), self.client_address)


if __name__ == "__main__":
    HOST, PORT = "localhost", 25555
    server = SocketServer.UDPServer((HOST, PORT), MyUDPHandler)
    server.serve_forever()

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

import socket
import sys
global HOST
global PORT
HOST, PORT = "localhost", 25555
while 1 > 0:
     data = raw_input(">".join(sys.argv[1:]))

# SOCK_DGRAM is the socket type to use for UDP sockets
     sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# As you can see, there is no connect() call; UDP has no connections.
# Instead, data is directly sent to the recipient via sendto().
     sock.sendto(data + "\n", (HOST, PORT))
     received = sock.recv(1024)

     print "Sent:     %s" % data
 print "Received: %s" % received

Ответы [ 2 ]

1 голос
/ 05 февраля 2011

Хотели бы вы поиграть с сервером, который отправляет пакеты всем сокетам, кроме исходного источника данных?

import socket, select

def main():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(('', 8989))
    server.listen(5)
    sockets = [server]
    while True:
        for sender in select.select(sockets, [], [])[0]:
            if sender is server:
                sockets.append(server.accept()[0])
            else:
                try:
                    message = sender.recv(4096)
                except socket.error:
                    message = None
                if message:
                    for receiver in sockets:
                        if receiver not in (server, sender):
                            receiver.sendall(message)
                else:
                    sender.shutdown(socket.SHUT_RDWR)
                    sender.close()
                    sockets.remove(sender)

if __name__ == '__main__':
    main()
1 голос
/ 05 февраля 2011

Сейчас ваше приложение создает экземпляр класса MyUDPHandler для каждого клиентского соединения. Когда соединение открыто, вам нужно сохранить этот экземпляр в статическом массиве или очереди. Затем, когда выполняется вызов handle (), он может перебрать все эти сокеты и отправить копию данных каждому из них.

Я бы ознакомился с документацией по Python; это в основном делает то, что вы ищете: http://docs.python.org/library/socketserver.html#asynchronous-mixins

И что я бы изменил из этого примера (не просто бросьте это; возможно, в нем есть явные ошибки!)

handlerList = []

class ...

    def handle(self):
        handlerList.append(self)
        while (1):
          data = self.request.recv(1024)
          if (not data):
            break
          cur_thread = threading.currentThread()
          response = "%s: %s" % (cur_thread.getName(), data)
          for x in handlerList:
            x.request.send(response)
        psudo_code_remove_self_from_handlerList()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...