【问题标题】:Python socket client works only for one iterationPython 套接字客户端仅适用于一次迭代
【发布时间】:2020-07-15 13:36:27
【问题描述】:

我正在尝试使用 python 实现套接字。以下代码在没有 while 循环的情况下运行良好。但使用 while 循环,对于第二次迭代,它会卡在 s.sendall() 中。请您建议如何解决这个问题 ?

def main():
    host = socket.gethostname()
    port = 11111                 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((host, port))
    print "Connected to Server!"
    while True:
        print "Enter your Command:"
        command = raw_input()
        if(command):
            try:
                sock.sendall(repr(command))
            except socket.error:
                print "Socket Error Occured"

            data = sock.recv(1024)
            if data:
                print('Received', repr(data))
            else:
                print "No Data"
        else:
            os.system("clear")
    sock.close()
if __name__ == "__main__":
    main()

【问题讨论】:

    标签: python python-3.x linux sockets


    【解决方案1】:

    你好

    我没有发布此帖子所需的所有信息 我想知道的,但是我可以做一些教育 d 猜测并尽力解释我认为出了什么问题。你准备好了吗??让我们开始吧。

    所以,

    您首先创建一个tcp socket,然后连接到本地托管在端口11111 上的服务器

        host = socket.gethostname()
        port = 11111                 
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.connect((host, port))
    

    接下来进入循环

        while True:
            #input command, request  eval
    

    您的目标是获取用户输入并将其发送到服务器到eval。你这样做

            #get user input
            print "Enter your Command:"
            command = raw_input()
    
            #send command to server for eval
            sock.sendall(repr(command))
    
            #receive then print eval
            data = sock.recv(1024)
            print('Received', repr(data))
    
    

    这可以按您的预期工作并发送命令,尽管发送 repr(command) 可能不是您想要发送的内容

    command = "1+1"
    eval(command) 
    //2
    eval(repr(command))
    //'1+1'
    

    现在

    这里是我必须做一些假设的地方

    早点connected到服务器

        sock.connect((host, port))
    

    我假设服务器 accepts 你的连接 evals 你的 command 并将答案发回。类似的东西

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind('localhost',11111)
    sock.listen()
    
    while True:
        conn, addr = sock.accept()
        command = conn.recv(1024)
        sock.sendall(eval(command))
    

    如果是这种情况,那么您的连接可能会失败,因为您的评估服务器运行一次eval,然后运行accepts 一个新连接。 这意味着您的客户端无法再向服务器发送数据或从服务器接收数据

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2013-12-15
      • 2013-10-24
      • 2019-09-08
      • 2021-12-22
      相关资源
      最近更新 更多