【问题标题】:Repeating/Continuous python server and client重复/连续的python服务器和客户端
【发布时间】:2014-04-24 20:44:46
【问题描述】:

我想建立一个系统,我有一个 python 客户端和服务器连续发送/接收数据。我发现的所有代码示例都显示了如何将单个消息发送到套接字,但没有显示如何连续设置发送/接收数据。

现在我的代码是:

client.py

import socket
import time

while True:
    try:
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client_socket.connect(("192.168.0.250", 10220))
        data = "GET\nSONAR\n\n"
        print 'send to server: ' + data
        client_socket.send(data)
        client_socket.close()
    except Exception as msg:
        print msg

我希望代码能够每分钟多次发送命令,但现在它似乎并不能始终如一地发送消息,我不知道为什么。为什么控制流不连续?

server.py

import socket

host = '192.168.0.100'
port = 8220
address = (host, port)

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((address))
server_socket.listen(5)

while True:
    try:
        print "Listening for client . . ."
        conn, address = server_socket.accept()
        print "Connected to client at ", address
        #pick a large output buffer size because i dont necessarily know how big the incoming packet is                                                                                              
        output = conn.recv(2048);
        if output:
            print "Message received from client:"
            print output

        #conn.send("This is a response from the server.")                                                                                                                                            
        conn.close()
        #print "Test message sent and connection closed." 

这在第一次尝试时运行良好,但我不能让服务器自动再次监听下一条消息——它总是挂在“正在监听客户端......”。

有什么想法吗?

谢谢!

【问题讨论】:

    标签: python sockets arduino


    【解决方案1】:

    这实际上对我来说很好,尽管我必须调整 client.py 中的端口以匹配 server.py 中的端口。我还必须在 server.py 中添加一个异常来处理 KeyboardInterrupt,以便有办法退出程序。

    倾听客户。 . . 连接到客户端 ('127.0.0.1', 53944) 从客户端收到的消息: 得到 声纳

    倾听客户。 . . 连接到客户端 ('127.0.0.1', 53945) 从客户端收到的消息: 得到 声纳

    编辑:

    我尝试改进架构。我创建一个连接并使用它来传递多条消息,在客户端中的每条消息之间暂停以等待服务器发送确认。

    client.py:

    import socket
    import time
    
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(("localhost", 8220))
    
    for index in xrange(5):
        data = "GET\nSONAR%d\n\n" % index
        print 'send to server: ' + data
        client_socket.send(data)
        while client_socket.recv(2048) != "ack":
            print "waiting for ack"
        print "ack received!"
    
    #send disconnect message                                                                                                                           
    dmsg = "disconnect"
    print "Disconnecting"
    client_socket.send(dmsg)
    
    client_socket.close()
    

    server.py:

    import socket
    import sys
    
    host = 'localhost'
    port = 8220
    address = (host, port)
    
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(address)
    server_socket.listen(5)
    
    print "Listening for client . . ."
    conn, address = server_socket.accept()
    print "Connected to client at ", address
    #pick a large output buffer size because i dont necessarily know how big the incoming packet is                                                    
    while True:
        output = conn.recv(2048);
        if output.strip() == "disconnect":
            conn.close()
            sys.exit("Received disconnect message.  Shutting down.")
            conn.send("dack")
        elif output:
            print "Message received from client:"
            print output
            conn.send("ack")
    

    【讨论】:

    • 这是我正在进行的一个更大项目的一部分,但看起来这不是问题...问题一定出在其他地方!
    • 查看我的编辑,了解我认为朝着更好的客户端/服务器架构迈进的方向。
    • 很有趣——可以从这个例子中学习!对于何时应该通过单个套接字发送多条消息与何时应该关闭/重新打开套接字以获取连续消息,是否有最佳实践?此外,永远不会使用您在客户端中的布尔值“已连接”。
    【解决方案2】:

    您最好使用 try 块和服务器套接字打开两个 while 循环,然后您可以从客户端获取连续消息,反之亦然。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      相关资源
      最近更新 更多