重复/持续的Python服务器和客户端

10 投票
2 回答
26048 浏览
提问于 2025-04-18 04:08

我想建立一个系统,让我的 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." 

第一次运行时这个是可以的,但我不能让服务器自动再次监听下一个消息——它总是停在“正在监听客户端...”这一步。

有什么想法吗?

谢谢!

2 个回答

-3

你最好使用两个 while 循环,并加上 try 块和服务器套接字,这样你就可以不断地接收来自客户端的信息,反过来也可以发送信息。

11

这段代码对我来说运行得很好,不过我需要在client.py里调整端口号,让它和server.py里的端口号一致。此外,我还得在server.py里添加一个异常处理,这样才能在程序运行时按下键盘中断(KeyboardInterrupt)来退出程序。

正在监听客户端 . . .

成功连接到客户端,地址是 ('127.0.0.1', 53944)

从客户端收到的消息:

GET

SONAR

正在监听客户端 . . .

成功连接到客户端,地址是 ('127.0.0.1', 53945)

从客户端收到的消息:

GET

SONAR

编辑:

我尝试改进了一下架构。我创建了一个连接,用它来传递多个消息,每次发送消息后,客户端会暂停一下,等待服务器发送确认。

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

撰写回答