Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python套接字编程-在侦听连接时需要执行一些操作_Python_Sockets - Fatal编程技术网

Python套接字编程-在侦听连接时需要执行一些操作

Python套接字编程-在侦听连接时需要执行一些操作,python,sockets,Python,Sockets,我正在用python设计一些硬件接口。我需要做的是: ~z~初始化驱动程序 ~z~启动设备 ~在端口2626创建一个套接字,等待客户端连接以接收数据 ~如果任何客户端已连接,则在为所有其他已连接客户端提供服务时发送hello消息,并将此客户端添加到已连接客户端列表中。 ~如果设备上发生任何事件,比如检测到温度升高,则通过此事件将数据发送给所有连接的客户端。 ~任何连接的客户端都可以向服务器请求任何特定数据 这是我的过程。我让设备部分工作得很好,现在它将数据打印到控制台,对于套接字服务器,我有以下

我正在用python设计一些硬件接口。我需要做的是:

~z~初始化驱动程序 ~z~启动设备 ~在端口2626创建一个套接字,等待客户端连接以接收数据 ~如果任何客户端已连接,则在为所有其他已连接客户端提供服务时发送hello消息,并将此客户端添加到已连接客户端列表中。 ~如果设备上发生任何事件,比如检测到温度升高,则通过此事件将数据发送给所有连接的客户端。 ~任何连接的客户端都可以向服务器请求任何特定数据

这是我的过程。我让设备部分工作得很好,现在它将数据打印到控制台,对于套接字服务器,我有以下代码,正如我所期望的那样工作得很好。 但问题是在调用“run()”之后,它进入了while循环。这是显而易见的。当我监听新的连接时,我无法调用任何其他函数

在监听连接时,我应该能够发送/接收。有什么办法吗

这是我的服务器程序,它可以很好地监听连接。在听的时候,你不允许听任何东西(


提前感谢您的帮助:)

您需要制作所有插座。

使用


显示使用核心python的异步网络的示例是。

因为twisted是不可能的,所以我建议使用该模块


要轻松开始,请参见此。

使用?@mikecoper谢谢您的建议,伙计。我是python新手。您是否有任何示例或可以指出一些快速入门教程?…或
socketserver
socketserver
用于Python2.x)@Kimvais您所说的是不使用twisted的吗?上周我才开始学习python。如果您能指出一些示例,我将更加感谢您。@San-如果您没有任何不能使用twisted的外部限制,请使用它。这是一个好的开始。@Kimvais-事实上我确实有这样的限制。如果使用纯python是不可能的,那么我必须去做。扭曲看起来笨重。我正在编写的这些程序将在内存较少的设备上运行,而不是在大型服务器上运行。因此,我更喜欢使用纯python。@san-您可以使用核心python进行异步网络编程,但这将花费您更多的工作和时间,如果您是python的初学者,那么您将有一个陡峭的学习曲线。@san如果您使套接字(服务器套接字)无阻塞,那么我觉得你提供的代码没有问题,我也试过了。对于你的ref,我通过nodejs脚本连接到这个。nodejs在这方面做得很好。我需要摆脱while循环。它停止了我的程序。在实例化类并调用run()方法后,如果我说
print“你可以在我听的时候做任何事”
这永远不会执行。@San啊,我想我知道你的意思了!一种解决方案是为
select
调用添加超时,如果超时,您可以执行其他操作,然后返回轮询套接字。另一个解决方案是将整个网络循环放在一个单独的线程中。是的,伙计,你明白我的意思了。我是python新手,一周前刚开始学习。我不知道在单独的线程中执行socketserver。还有一点,如果我得到任何硬件事件,我需要将事件数据推送到套接字。有什么想法吗。非常感谢你在这件事上的帮助。非常感谢你的建议。我在socketServer上得到了这个结果。:)
#!/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()