用于初学者的套接字编程 - 服务器创建

时间:2013-12-07 07:09:23

标签: python sockets networking

我开始学习套接字编程,我创建了一个简单的服务器,它应该重播我寄给他的所有内容 它的工作和我设法telnet到它并写东西。 但我的代码有两个问题:

  1. 首先,我在键盘上击中的每一声叹息都会立即发送,然后我就会回来。它不会等到我按回车键。

  2. 其次,当我打印到客户端'Welcome to the server. Type something and hit enter\n\n'时,客户端会在新行的中间看到cmd imput光标,而不是在它的开头。

  3. 这是我的代码的一部分:

    #server in local host
    class ClientConnection(threading.Thread):
        def __init__(self,conn):
            threading.Thread.__init__(self)
            self.conn = conn
    
        def run(self):
            clientthread(self.conn)
    
    #create a new thread for each connection
    def clientthread(conn):
        conn.send('Welcome to the server. Type something and hit enter\n\n'.encode())
        while True:
            data = conn.recv(2048).decode()
            replay = 'OK....' + data
            if not data:
                break
            conn.sendall(replay.encode())
        conn.close()
    
    ...  #socket get close in the end
    

    如果客户端按下回车键,我该如何进行服务器响应?我试着检查一下recive = '\n'但它似乎不起作用。 我将不胜感激任何帮助和提示

    编辑:我的第二个问题只是

1 个答案:

答案 0 :(得分:1)

是的,客户端通常会在用户输入时向您发送数据,而不是仅在用户返回时发送。因此,您需要检查数据是否有返回,并且只有在返回时才会响应。

data = ""
while True:
    chunk = conn.recv(2048).decode()
    if not data:
        break
    # try to separate the chunk by newline, to see if you got one.
    while True:
        split = chunk.split("\r\n", num=1)
        data += split[0]
        if len(split) == 1:
            break
        # Now we have a completed newline, so send the response
        replay = 'OK....' + data
        conn.sendall(replay.encode())
        data = ""
conn.close()