Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 面向初学者的socket编程-服务器创建_Python_Sockets_Networking - Fatal编程技术网

Python 面向初学者的socket编程-服务器创建

Python 面向初学者的socket编程-服务器创建,python,sockets,networking,Python,Sockets,Networking,我开始学习socket编程,并创建了一个简单的服务器,可以将我发送给他的所有内容都回放给我。 它的工作和我设法telnet到它和写东西。 但我的代码有两个问题: 首先,我在键盘上发出的每一声叹息都会立即被发送,我也会得到回复。它不会等到我按下回车键 第二,当我打印到客户端时,欢迎使用服务器。键入某物并点击输入\n\n’/COD>客户端在新行的中间看到CMD输入光标,而不是在它的开头。 以下是我的部分代码: #server in local host class ClientConnection(

我开始学习socket编程,并创建了一个简单的服务器,可以将我发送给他的所有内容都回放给我。
它的工作和我设法telnet到它和写东西。 但我的代码有两个问题:

  • 首先,我在键盘上发出的每一声叹息都会立即被发送,我也会得到回复。它不会等到我按下回车键

  • 第二,当我打印到客户端时,欢迎使用服务器。键入某物并点击输入\n\n’/COD>客户端在新行的中间看到CMD输入光标,而不是在它的开头。

  • 以下是我的部分代码:

    #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
    
    如何仅在客户端按enter键时才做出服务器响应?我试图检查
    recive='\n'
    是否有效,但它似乎不起作用。 我将感谢任何帮助和提示


    编辑:我的第二个问题的答案很简单

    是的,客户端通常会在用户键入时向您发送数据,而不是仅在用户点击返回时发送。因此,由您检查数据是否有返回,并仅在返回时进行响应

    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()
    

    每一行都应该以
    \r\n
    结尾。谢谢,您简单地解决了我的第二个问题。我认为服务器应该在阅读了客户端的请求后发送一些内容。请尝试注释行
    conn.send('欢迎使用服务器。键入一些内容,然后按enter\n\n'.encode())
    ,看看它是否有效。免责声明:此代码未经测试,并且在深夜被破解,因此请将其视为伪代码,而不是代码,并确保您仔细测试和理解它。谢谢您的帮助。我有了这个想法,做了类似的事情,但不是两次:-)