使用python中的键盘快捷键终止客户端与服务器的连接



我正在尝试修改在python中实现的服务器和客户端聊天脚本。其中一个要求是,当用户键入CTRL-D时,客户端退出。我的问题是如何阅读用户键入的(ctrl-D)并在该代码中实现它。我是否应该像c_socket.close()一样关闭套接字,而不向服务器返回任何我正在退出的消息?

谢谢!

# telnet program example
import socket, select, string, sys
import readline 
def prompt() :
sys.stdout.write('<You> ')
sys.stdout.flush()
#main function
if __name__ == "__main__":
if(len(sys.argv) < 3) :
print 'Usage : python MClient hostname port'
sys.exit()
host = sys.argv[1]
port = int(sys.argv[2])
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(2)
# connect to remote host
try :
s.connect((host, port))
except :
print 'Unable to connect'
sys.exit()
print 'Connected to remote host. Start sending messages'
prompt()
while 1:
socket_list = [sys.stdin, s]
# Get the list sockets which are readable
read_sockets, write_sockets, error_sockets = select.select(socket_list , [], [])
for sock in read_sockets:
#incoming message from remote server
if sock == s:
data = sock.recv(4096)
if not data :
print 'nDisconnected from chat server'
sys.exit()
else :
#print data
sys.stdout.write(data)
prompt()
#user entered a message
else :
msg = sys.stdin.readline()
s.send(msg)
prompt()

最后一件事首先-是否需要在关闭套接字之前向服务器发送内容完全取决于您的协议。考虑到所提供的客户端代码的简单性,我想关闭套接字就足够了(服务器无论如何都应该处理未经通知的断开连接,因为不应该认为网络I/O是持久的)。

其次,CTRL+D将导致从sys.stdin.readline()返回的消息返回为空,因此您可以对此进行测试,例如:

msg = sys.stdin.readline()
if msg:
s.send(msg)
prompt()
else:
s.close()
sys.exit()

如果确实需要向服务器发送内容(同样,取决于协议),可以在调用close()之前使用socket的shutdown()方法。

但是,请记住,这里提供的代码不考虑在从套接字读取(即接收数据)时按下CTRL+D,因此,如果有特别长的数据流进入您的CTRL+D将不会被注册。您可以通过在检索过程中检查用户输入(并将其写入缓冲区以备稍后发送)来解决此问题,也可以将接收代码放在一个单独的线程中,并将主线程留给用户输入。

然后,您可以随时使用atexit模块从客户端干净地退出。

相关内容

最新更新