如何创建消息协议

发布于 2024-12-20 23:40:59 字数 258 浏览 0 评论 0原文

所以我必须创建一个像这样工作的消息协议:

codFunc arg1 arg2...

例如:

0 'hello world'
10 'user' 'password'

现在我连接发送,并使用 string.split 来读取,但出于多种原因,这不是最好的方法。

所以我的问题是,创建协议的最佳方法是什么?我应该使用哪些现有协议?

谢谢。

So I have to create a message protocol that works like this:

codFunc arg1 arg2...

ex:

0 'hello world'
10 'user' 'password'

Right now I concatenate to send, and use string.split to read, but for several reasons, that is not the best way.

So my question is, what's the best way to create the protocol? What existing protocols should I use?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情丝乱 2024-12-27 23:40:59

shlex 可能很好,split 有引用空格的问题,pickle 不安全。 JSON 很好。

我喜欢用:
https://www .google.com/search?gcx=c&ix=c1&sourceid=chrome&ie=UTF-8&q=bufsock
...使用以 null 结尾的 ASCII 数据或其他内容来锚定协议的某些部分。

请记住,send() 和 receive() 之间并不总是存在一对一的关系。人们很容易对此感到自满,但它可能会导致网络负载下的可靠性问题。

shlex is probably good, split has problems with quoted whitespace, pickle is insecure. JSON is good.

I like to use:
https://www.google.com/search?gcx=c&ix=c1&sourceid=chrome&ie=UTF-8&q=bufsock
...with ASCII data that's null terminated or something, to anchor parts of the protocol.

Bear in mind that there's not always a one to one relationship between send()'s and recv()'s. It's easy to get complacent about this, but it can cause reliability problems under network load.

美人迟暮 2024-12-27 23:40:59

split 的问题在于,如果您的用户名包含空格,它将被拆分为单独的参数。

将其拆分一次以获得负责的函数编号:

num, args = s.split(None, 1)

将字符串解析为参数,可能使用 shlex

import shlex
argv = shlex.split(args)

删除周围的引号:

argv = [s.strip(shlex.quotes) for s in argv]

调用您的函数:

myfunc(*argv)

What is wrong with split is that if your username contains white-space, it will be splited into separate arguments.

Split it one time to get responsible function number:

num, args = s.split(None, 1)

Parse string into arguments, maybe with shlex:

import shlex
argv = shlex.split(args)

Remove surrounding quotes:

argv = [s.strip(shlex.quotes) for s in argv]

Call your function:

myfunc(*argv)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文