现在有一个 django 项目本身是作为 http 服务器端的,但同时它也需要充当客户端的身份给另一 http 服务器和另一 tcp 服务器发送数据。
问题是: 1 、这个功能逻辑上应该是可以实现不违反 django 设计的吧? 2 、充当客户端身份创建 socket/http 连接应该写在程序哪里?因为新手对 django 运行机制不了解,不知道它的程序入口什么的,不像普通 python 程序有明确的 main 函数。如果是普通 python 程序我直接创建多个协程分别管不同的连接就好了。 3 、有一个转发的功能,客户端将消息发给此 django 服务器,服务器再转发给另一个 tcp 服务器,那这过程中我怎么获取那个连接上的 socket 呢,全局变量吗
嗯感觉应该说明白了,新手第一次提问先跪谢大家了
1
37Y37 2020-12-01 17:55:48 +08:00
如果没理解错的话,其实你只需要一个 socket 服务就行了,django 下可以看看 channels
|
2
kyuuseiryuu 2020-12-01 17:58:31 +08:00 via iPhone
直接用 websocket 呗?连定义协议都给你省了
|
3
37Y37 2020-12-01 18:06:43 +08:00
给两篇 django websocket 的文章参考吧
https://blog.ops-coffee.cn/s/hqaPrPS7w3D-9SeegQAB2Q https://blog.ops-coffee.cn/s/r5SpyTjRl0jJeAuYE4Q_-Q |
4
IVeverKB OP |
5
IVeverKB OP @kyuuseiryuu
意思是跟 tcp 服务器使用 websocket 通信而不使用 tcp 通信?可是我就想用 tcp 。。虽然说 websocket 是基于 tcp 的,但它们通信还是有区别不能完全兼容的吧(我的理解)? |
6
kyuuseiryuu 2020-12-04 14:03:54 +08:00
@IVeverKB #5 两端都用 websocket 啊,有现成的库。
|
7
IVeverKB OP @kyuuseiryuu
ok 我懂了。但是两端都用 tcp 有什么弊端吗,没太懂您说的“定义协议都给省了”具体是什么意思哈哈还请赐教 |
8
kyuuseiryuu 2020-12-04 14:32:41 +08:00
@IVeverKB #7 TCP 是面向流的,你开发的过程中要自己解析数据流转成你需要的格式,比如你可能要定义数据部分的大小,然后按大小读入流去解析。否则你会发出 “噫?怎么粘包了?我 server 端 send 两次,但 client 端 receive 一次就把两次发的内容一起读出来了?” 这种疑问。
|
9
IVeverKB OP @kyuuseiryuu
wow 我悟了大师!看了好多 websocket 和 tcp 区别的文章都没讲到这点。 一个不相关的问题,django 支持 http 支持 websocket 为什么就不支持 tcp 呢,在网上搜索关键字 django+tcp 出来内容好少。如果有业务需求必须用 tcp 连接应该怎么办呢,不懂是我对 django 了解太少还是 django 本身就没有这方面的机制? |
10
kyuuseiryuu 2020-12-04 15:19:33 +08:00 1
@IVeverKB #9 网络七层模型,业务是属于应用层的,TCP 是传输层的。有业务要用到 TCP 是肯定的,互联网上就离不开 TCP/UDP 。如果没有自己的加密或者其他规则,也不过是再造了个 websocket 或者 HTTP 罢了。
HTTP 框架已经帮你把 TCP 封装好了,你要拿到原生的 socket 对象也是可以的,但这得查文档。 Django 是应用层 HTTP 框架( Framework ),如果要用到 TCP,应该用到的是 socket 库( Library )。因为并不知道你的业务是什么,没法给你抽象出来特定的模式。 |
11
IVeverKB OP @kyuuseiryuu #10
感谢感谢感谢,突然明白很多!!! |