【问题标题】:Terminating client connection to server using keyboard shortcut in python使用python中的键盘快捷键终止客户端与服务器的连接
【发布时间】:2017-02-14 20:04:06
【问题描述】:

我正在尝试修改在 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()

【问题讨论】:

    标签: python python-2.7 sockets serversocket


    【解决方案1】:

    最后一件事——你是否需要在关闭套接字之前向服务器发送一些东西完全取决于你的协议。鉴于所呈现的客户端代码的简单性,我猜想关闭套接字就足够了(并且服务器无论如何都应该处理未通知的断开连接,因为不应将网络 I/O 视为持久性)。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      • 2012-07-16
      • 2016-09-19
      • 2014-05-12
      相关资源
      最近更新 更多