Python: 在特定时间后关闭套接字,无论客户端是否连接到它

Python: Close socket after specific time whether the client connected to it or not

首先,我是 python 初学者,所以我不是很有经验。 这是我的服务器-客户端程序的代码:

import getpass
from requests import get
import os
import thread
import socket
import sys

os.system('cls' if os.name == 'nt' else 'clear')
print '3[91mMCP CONTROLLER3[0m'
print ('--------------------------------------')
print ('Welcome back,' + getpass.getuser())
print ('--------------------------------------')
ip = get('https://api.ipify.org').text
print ('Your current external IP is: ' + ip) 
print ('--------------------------------------')

HOST = 'localhost'
PORT = 1979

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created!'

try:
    s.bind((HOST, PORT))
except socket.error as msg:
    print 'lul'
    sys.exit()

print 'Socket bind complete'

s.listen(20)

print 'Listening...'


while 1:
    conn, addr = s.accept()
    print 'Client connected: ' + addr[0] + ':' + str(addr[1])

msg = conn.recv(1024)
print (msg) 


s.close()
print ('Please enter command')

我的问题是:我希望程序在 20 秒后停止套接字并执行 "print('Please enter command')" 无论是否有人连接到它。如果我现在启动程序,它只会永远显示 "Listening..."(如果我不启动客户端),我唯一的选择就是关闭终端 window。但我希望程序在 20 秒后继续运行。 而且我还希望它在 20 秒后没有获得任何连接时说一些特殊消息(例如 print 'no client available')

请原谅我糟糕的英语。

使用socket.settimeout ()

s.settimeout (20);

正如@abarnet 提到的,settimeout 可能是您想要的,这里有一个例子:

import getpass
from requests import get
import os
import thread
import socket
import sys
import time

os.system('cls' if os.name == 'nt' else 'clear')
print('3[91mMCP CONTROLLER3[0m')
print ('--------------------------------------')
print ('Welcome back,' + getpass.getuser())
print ('--------------------------------------')
ip = get('https://api.ipify.org').text
print ('Your current external IP is: ' + ip) 
print ('--------------------------------------')

HOST = 'localhost'
PORT = 1979

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print ('Socket created!')

try:
    s.bind((HOST, PORT))
except socket.error as msg:
    print( 'lul')
    sys.exit()

print( 'Socket bind complete')

s.settimeout(5)
s.listen(20)

print ('Listening...')

while 1:
    try:
        conn, addr = s.accept()
        msg = conn.recv(1024)
        print (msg) 
    except socket.timeout as e:
        print(e,': no connections after 5 seconds...')
        s.close()
        break
    print( 'Client connected: ' + addr[0] + ':' + str(addr[1]))

print('please enter command:')