我写了一个非常简单的python类,它等待socket上的连接.目的是将此类添加到现有应用程序中,并将数据异步发送到连接客户端.
问题是当等待socket.accept()时,我无法通过按ctrl-c结束我的应用程序.我也无法检测到我的课程何时超出范围并通知它结束.
理想情况下,以下应用程序应在time.sleep(4)到期后退出.正如您在下面看到的,我尝试使用select,但这也会阻止应用程序响应ctrl-c.如果我能在主方法中检测到变量'a'超出范围,我可以设置退出标志(并减少select的超时以使其响应).
有任何想法吗?
谢谢
import sys
import socket
import threading
import time
import select
class Server( threading.Thread ):
def __init__( self, i_port ):
threading.Thread.__init__( self )
self.quitting = False
self.serversocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
self.serversocket.bind( (socket.gethostname(), i_port ) )
self.serversocket.listen(5)
self.start()
def run( self ):
# Wait for connection
while not self.quitting:
rr,rw,err = select.select( [self.serversocket],[],[], 20 )
if rr:
(clientsocket, address) = self.serversocket.accept()
clientsocket.close()
def main():
a = Server( 6543 )
time.sleep(4)
if __name__=='__main__':
main()
Run Code Online (Sandbox Code Playgroud)
我最近开始学习Python(这里是长期的Java程序员),目前正在编写一些简单的服务器程序。问题是,对于看似相似的一段代码,Java对应部分正确响应SIGINT信号(Ctrl+ C),而Python则没有响应。当使用单独的线程生成服务器时,可以看到这一点。代码如下:
// Java code
package pkg;
import java.io.*;
import java.net.*;
public class ServerTest {
public static void main(final String[] args) throws Exception {
final Thread t = new Server();
t.start();
}
}
class Server extends Thread {
@Override
public void run() {
try {
final ServerSocket sock = new ServerSocket(12345);
while(true) {
final Socket clientSock = sock.accept();
clientSock.close();
}
} catch(Exception e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
和Python代码:
# Python code
import threading, sys, …Run Code Online (Sandbox Code Playgroud)