Программирование сокетов на Python - нужно что-то делать во время прослушивания соединений
Я нахожусь в процессе разработки некоторого аппаратного интерфейса с 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:%srn' % (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 serverrn")
str = 'Client joined %s:%srn' % (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 ответов:
Поскольку twisted не обсуждается, я предлагаю использовать модуль socketserver .
Для легкого начала, смотрите этотПример .
Вам нужно сделать все сокеты неблокирующими.
Comments