Python 如何实现无陷阱的简单请求响应技术

Python 如何实现无陷阱的简单请求响应技术,python,c++,sockets,network-programming,boost-asio,Python,C++,Sockets,Network Programming,Boost Asio,我想创建简单的客户端和服务器,它们应该按照如下请求-响应原则工作: 客户端发送以下字符串:“dou\u一些东西” 服务器执行适当的操作并发送以下字符串作为响应:“success” 客户端读取响应并进行一些日志记录 一段时间后,客户端发送新命令,所有操作再次重复 听起来容易吗?不幸的是,我有以下问题: 我应该使用哪种技巧来阅读回答?我应该一直读取数据直到出现某些特定字符序列,还是应该在某种while true循环中调用read函数并等待连接关闭(在发送响应后,我将关闭服务器端的套接字) 我不

我想创建简单的客户端和服务器,它们应该按照如下请求-响应原则工作:

  • 客户端发送以下字符串:“dou\u一些东西”
  • 服务器执行适当的操作并发送以下字符串作为响应:“success”
  • 客户端读取响应并进行一些日志记录
  • 一段时间后,客户端发送新命令,所有操作再次重复
听起来容易吗?不幸的是,我有以下问题:

  • 我应该使用哪种技巧来阅读回答?我应该一直读取数据直到出现某些特定字符序列,还是应该在某种
    while true
    循环中调用
    read
    函数并等待连接关闭(在发送响应后,我将关闭服务器端的套接字)
  • 我不明白为什么有这么多的例子只读取了一些字节(例如1024字节),希望答案能被完全读取?如果我们说应该得到1024个字节,为什么库决定在“成功”之后没有更多的字节?因为服务器端的连接关闭
  • 如果
    read\u until
    永远无法获取终止字符序列(例如,由于internet连接),该怎么办?它会无限期地等待吗
总而言之,这样做可以吗

客户端

#include <boost/asio.hpp>

#include <iostream>

int main()
{
  try
  {
    boost::asio::io_service io_service;

    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query(boost::asio::ip::tcp::v4(), "127.0.0.1", "5013");
    boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);

    boost::asio::ip::tcp::socket s(io_service);
    boost::asio::connect(s, iterator);

    boost::asio::streambuf request;
    std::ostream request_stream(&request);
    request_stream << "do_some_stuff\n";

    boost::asio::write(s, request);

    boost::asio::streambuf b;
    boost::asio::read_until(s, b, '\n');
    std::istream is(&b);
    std::string line;
    std::getline(is, line);

    std::cout << "Reply is: " << line << std::endl;
  }
  catch (std::exception& e)
  {
    std::cerr << "Exception: " << e.what() << "\n";
  }
}
这个解决方案有错吗?顺便问一下,为什么
client.recv(1024)
在从套接字接收1024字节之前就完成了?它如何知道它之后没有数据?它实际上是如何工作的

提前感谢。

  • 最常用的方法是使用指定长度和读取的标题 直到收到所有字节。还可以使用消息分隔符 用了很多。对于无连接,可以等待连接结束 通信,即建立连接,发送消息 (和回复)并关闭每条消息,效率较低

  • 使用一次读取来获取tcp消息的所有字节是一种常见的方法 这是一个通常适用于短消息的错误。错误 tcp是一种流协议,而不是消息协议。 然而,tcp主要用于传递消息。长度 参数应该是缓冲区的大小,而不是预期的数字 字节数。读者知道它何时可以返回,因为发送者 发送数据包

  • 当连接丢失而没有机会通知时(例如电源 关闭,电缆断开),这可能导致无休止的等待。可能的 解决办法是


非常感谢您的回答!所以,我的代码在任何情况下都应该正常工作,对吗?没有测试就不能保证,但对我来说已经足够好了。谢谢!以及
client.recv(1024)
如何决定何时结束读取数据?基于通过TCP层上的TCP发送的数据包。它可以根据不完整的mtu数据包或下一个数据包的超时来决定。
import socket
import threading

def main():
    listener = socket.socket()
    listener.bind(('127.0.0.1', 5013))
    listener.listen(5)
    while True:
        client, _ = listener.accept()
        worker_thread = threading.Thread(target=worker, args=(client,))
        worker_thread.setDaemon(True)
        worker_thread.start()

def worker(client):
    data = ""
    while True:
        packet = client.recv(1024)
        if not packet:
            break

        data += packet

        if '\n' in data:
            line, data = data.split('\n', 1)
            print line
            client.sendall('success\n')

if __name__ == '__main__':
    main()