[django]中如何启动额外的 socket 连接

2020-12-01 17:13:33 +08:00
 IVeverKB

现在有一个 django 项目本身是作为 http 服务器端的,但同时它也需要充当客户端的身份给另一 http 服务器和另一 tcp 服务器发送数据。

问题是: 1 、这个功能逻辑上应该是可以实现不违反 django 设计的吧? 2 、充当客户端身份创建 socket/http 连接应该写在程序哪里?因为新手对 django 运行机制不了解,不知道它的程序入口什么的,不像普通 python 程序有明确的 main 函数。如果是普通 python 程序我直接创建多个协程分别管不同的连接就好了。 3 、有一个转发的功能,客户端将消息发给此 django 服务器,服务器再转发给另一个 tcp 服务器,那这过程中我怎么获取那个连接上的 socket 呢,全局变量吗

嗯感觉应该说明白了,新手第一次提问先跪谢大家了

2415 次点击
所在节点    Django
11 条回复
37Y37
2020-12-01 17:55:48 +08:00
如果没理解错的话,其实你只需要一个 socket 服务就行了,django 下可以看看 channels
kyuuseiryuu
2020-12-01 17:58:31 +08:00
直接用 websocket 呗?连定义协议都给你省了
37Y37
2020-12-01 18:06:43 +08:00
IVeverKB
2020-12-01 18:13:54 +08:00
@kyuuseiryuu
@37Y37
诶呀网友们好热心哈哈,我今晚先回去学下看看可不可行!
IVeverKB
2020-12-04 13:57:42 +08:00
@kyuuseiryuu
意思是跟 tcp 服务器使用 websocket 通信而不使用 tcp 通信?可是我就想用 tcp 。。虽然说 websocket 是基于 tcp 的,但它们通信还是有区别不能完全兼容的吧(我的理解)?
kyuuseiryuu
2020-12-04 14:03:54 +08:00
@IVeverKB #5 两端都用 websocket 啊,有现成的库。
IVeverKB
2020-12-04 14:23:34 +08:00
@kyuuseiryuu
ok 我懂了。但是两端都用 tcp 有什么弊端吗,没太懂您说的“定义协议都给省了”具体是什么意思哈哈还请赐教
kyuuseiryuu
2020-12-04 14:32:41 +08:00
@IVeverKB #7 TCP 是面向流的,你开发的过程中要自己解析数据流转成你需要的格式,比如你可能要定义数据部分的大小,然后按大小读入流去解析。否则你会发出 “噫?怎么粘包了?我 server 端 send 两次,但 client 端 receive 一次就把两次发的内容一起读出来了?” 这种疑问。
IVeverKB
2020-12-04 14:53:44 +08:00
@kyuuseiryuu
wow 我悟了大师!看了好多 websocket 和 tcp 区别的文章都没讲到这点。
一个不相关的问题,django 支持 http 支持 websocket 为什么就不支持 tcp 呢,在网上搜索关键字 django+tcp 出来内容好少。如果有业务需求必须用 tcp 连接应该怎么办呢,不懂是我对 django 了解太少还是 django 本身就没有这方面的机制?
kyuuseiryuu
2020-12-04 15:19:33 +08:00
@IVeverKB #9 网络七层模型,业务是属于应用层的,TCP 是传输层的。有业务要用到 TCP 是肯定的,互联网上就离不开 TCP/UDP 。如果没有自己的加密或者其他规则,也不过是再造了个 websocket 或者 HTTP 罢了。

HTTP 框架已经帮你把 TCP 封装好了,你要拿到原生的 socket 对象也是可以的,但这得查文档。

Django 是应用层 HTTP 框架( Framework ),如果要用到 TCP,应该用到的是 socket 库( Library )。因为并不知道你的业务是什么,没法给你抽象出来特定的模式。
IVeverKB
2020-12-04 15:42:49 +08:00
@kyuuseiryuu #10
感谢感谢感谢,突然明白很多!!!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/731049

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX