Программирование на Python Socket - нужно что-то делать во время прослушивания соединений - PullRequest
3 голосов
/ 16 февраля 2012

Я нахожусь в процессе разработки аппаратного интерфейса с Python.мне нужно сделать следующее:

~ инициализировать драйверы ~ запустить устройство ~ создать сокет на порту 2626 и дождаться подключения клиентов для получения данных ~ если подключился какой-либо клиент, отправьте приветственное сообщениеобслуживая всех других подключенных клиентов и добавьте этого клиента в список подключенных клиентов.~ если какое-либо событие произошло на устройстве, скажем, повышение температуры обнаружено, то через эти данные события для всех подключенных клиентов.~ любые подключенные клиенты могут запрашивать у сервера какие-либо конкретные данные.

Это мой процесс.Я получил, что часть устройства работает отлично, теперь она печатает данные на консоль, и для сервера сокетов у меня есть следующий код, который работает нормально, как я ожидаю.но проблема в том, что после вызова run () происходит внутри цикла while.это очевидно, хотя.когда я слушаю новые соединения, я не могу вызвать любую другую функцию.

во время прослушивания соединений я должен быть в состоянии отправить / recv.есть идеи, как это сделать?

это моя серверная программа, которая прекрасно работает для прослушивания соединений.во время прослушивания вы ни к чему не можете.: (

#!/usr/bin/env python

import socket
import select

class ChatServer:

    def __init__( self, port ):
        self.port = port;

        self.srvsock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
        self.srvsock.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
        self.srvsock.bind( ("", port) )
        self.srvsock.listen( 5 )

        self.descriptors = [self.srvsock]
        print 'Server started on port %s' % port

    def run( self ):
        while 1:
            # Await an event on a readable socket descriptor
            (sread, swrite, sexc) = select.select( self.descriptors, [], [] )
            # Iterate through the tagged read descriptors
            for sock in sread:
                # Received a connect to the server (listening) socket
                if sock == self.srvsock:
                    self.accept_new_connection()
                else:
                    # Received something on a client socket
                    str = sock.recv(100)

                    # Check to see if the peer socket closed
                    if str == '':
                        host,port = sock.getpeername()
                        str = 'Client left %s:%s\r\n' % (host, port)
                        self.broadcast_string( str, sock )
                        sock.close
                        self.descriptors.remove(sock)
                    else:
                        host,port = sock.getpeername()
                        newstr = '[%s:%s] %s' % (host, port, str)
                        self.broadcast_string( newstr, sock )

    def accept_new_connection( self ):
        newsock, (remhost, remport) = self.srvsock.accept()
        self.descriptors.append( newsock )

        newsock.send("You're connected to the Python server\r\n")
        str = 'Client joined %s:%s\r\n' % (remhost, remport)
        self.broadcast_string( str, newsock )

    def broadcast_string( self, str, omit_sock ):
        for sock in self.descriptors:
            if sock != self.srvsock and sock != omit_sock:
                sock.send(str)
        print str,

myServer = ChatServer( 2626 ).run()

Заранее благодарим за всю вашу помощь:)

Ответы [ 3 ]

1 голос
/ 16 февраля 2012

Использование Витая

Пример, показывающий асинхронную сеть с ядром Python: здесь .

1 голос
/ 16 февраля 2012

Поскольку витая речь не обсуждается, я предлагаю использовать модуль socketserver .

Для легкого начала, посмотрите этот пример .

1 голос
/ 16 февраля 2012

Нужно сделать все розетки неблокирующими .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...