V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
IVeverKB
V2EX  ›  Django

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

  •  
  •   IVeverKB · 2020-12-01 17:13:33 +08:00 · 2565 次点击
    这是一个创建于 1488 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    11 条回复    2020-12-04 15:42:49 +08:00
    37Y37
        1
    37Y37  
       2020-12-01 17:55:48 +08:00
    如果没理解错的话,其实你只需要一个 socket 服务就行了,django 下可以看看 channels
    kyuuseiryuu
        2
    kyuuseiryuu  
       2020-12-01 17:58:31 +08:00 via iPhone
    直接用 websocket 呗?连定义协议都给你省了
    37Y37
        3
    37Y37  
       2020-12-01 18:06:43 +08:00
    IVeverKB
        4
    IVeverKB  
    OP
       2020-12-01 18:13:54 +08:00
    @kyuuseiryuu
    @37Y37
    诶呀网友们好热心哈哈,我今晚先回去学下看看可不可行!
    IVeverKB
        5
    IVeverKB  
    OP
       2020-12-04 13:57:42 +08:00
    @kyuuseiryuu
    意思是跟 tcp 服务器使用 websocket 通信而不使用 tcp 通信?可是我就想用 tcp 。。虽然说 websocket 是基于 tcp 的,但它们通信还是有区别不能完全兼容的吧(我的理解)?
    kyuuseiryuu
        6
    kyuuseiryuu  
       2020-12-04 14:03:54 +08:00
    @IVeverKB #5 两端都用 websocket 啊,有现成的库。
    IVeverKB
        7
    IVeverKB  
    OP
       2020-12-04 14:23:34 +08:00
    @kyuuseiryuu
    ok 我懂了。但是两端都用 tcp 有什么弊端吗,没太懂您说的“定义协议都给省了”具体是什么意思哈哈还请赐教
    kyuuseiryuu
        8
    kyuuseiryuu  
       2020-12-04 14:32:41 +08:00
    @IVeverKB #7 TCP 是面向流的,你开发的过程中要自己解析数据流转成你需要的格式,比如你可能要定义数据部分的大小,然后按大小读入流去解析。否则你会发出 “噫?怎么粘包了?我 server 端 send 两次,但 client 端 receive 一次就把两次发的内容一起读出来了?” 这种疑问。
    IVeverKB
        9
    IVeverKB  
    OP
       2020-12-04 14:53:44 +08:00
    @kyuuseiryuu
    wow 我悟了大师!看了好多 websocket 和 tcp 区别的文章都没讲到这点。
    一个不相关的问题,django 支持 http 支持 websocket 为什么就不支持 tcp 呢,在网上搜索关键字 django+tcp 出来内容好少。如果有业务需求必须用 tcp 连接应该怎么办呢,不懂是我对 django 了解太少还是 django 本身就没有这方面的机制?
    kyuuseiryuu
        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 )。因为并不知道你的业务是什么,没法给你抽象出来特定的模式。
    IVeverKB
        11
    IVeverKB  
    OP
       2020-12-04 15:42:49 +08:00
    @kyuuseiryuu #10
    感谢感谢感谢,突然明白很多!!!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2764 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:59 · PVG 21:59 · LAX 05:59 · JFK 08:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.