搜尋

首頁  >  問答  >  主體

如何终止用python写的socket服务端程序?

用python写了一个socket服务端的程序,但是启动之后由于监听连接的是一个死循环,所以不知道怎样在cmd运行程序的时候将其终止。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import socket
import threading, time

def tcplink(sock,addr):
    print('Accept new connection from %s:%s...' %addr)
    sock.send(b'Welcome!')
    while True:
        data=sock.recv(1024)
        time.sleep(1)
        if not data or data.decode('utf-8')=='exit':
            break
        sock.send(('Hello,%s!'% data.decode('utf-8')).encode('utf-8'))
    sock.close()
    print('Connection from %s:%s closed.' % addr)
    
s=socket.socket()
s.bind(('127.0.0.1',1234))
s.listen(5)
print('Waiting for conection...')

while True:
    #accept a new connection
    sock,addr=s.accept()
    #create a new thread
    t=threading.Thread(target=tcplink,args=(sock,addr))
    t.start()

在win10上的cmd运行后的情况是按ctrl+c,ctrl+z,ctrl+d都不能终止,请问要怎么终止程序?

黄舟黄舟2862 天前810

全部回覆(6)我來回復

  • 迷茫

    迷茫2017-04-18 10:22:24

    Ctrl + C

    回覆
    0
  • PHPz

    PHPz2017-04-18 10:22:24

    在啟動執行緒之前,加入 setDaemon(True)

    雷雷

    守護程式

    一個布林值,指示該執行緒是否是守護程式
    執行緒(True)或不是(False)。這必須在呼叫 start() 之前設置,否則會引發 RuntimeError。它的初始值
    繼承自創建線程;主線程不是守護程序
    線程,因此在主線程中創建的所有線程預設為
    daemon = False.

    當沒有存活的非守護線程

    時,整個Python程序將退出。

    這樣 的中斷訊號就會被提高。

    回覆
    0
  • 阿神

    阿神2017-04-18 10:22:24

    雷雷

    回覆
    0
  • 高洛峰

    高洛峰2017-04-18 10:22:24

    關閉cmd指令窗口,重新開啟一個cmd,我是這麼做的。

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-18 10:22:24

    可以使用signal模組,當按住Ctrl+C時,捕捉資訊,然後退出.

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import signal
    
    def do_exit(signum, frame):
        print("exit ...")
        exit()
    
    signal.signal(signal.SIGINT, do_exit)
    
    while True:
        print("processing ...")
    

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:22:24

    我記得可以

    try:
        ......
    except KeyboardInterrupt:
        exit()

    回覆
    0
  • 取消回覆