小程序一对一聊天功能怎么实现?小程序怎么做聊天

小程序一对一聊天功能怎么实现?小程序怎么做聊天,第1张

简单描述一下多端通信,目前我使用的是websocket。

服务端我用C#做的winform,Fleck技术很成熟,服务端开启,客户端连接服务端,请求服务,websocket就支持多端通信的哦,你用android或者web或者其他平台都可以连接websocket的服务。向服务端发送消息,服务端就会分配消息。

1对1聊天这种事情是你想多了,现在真的没有人干这事,双方通过三次握手一个socket拨通协议的事情是不协和的,因为你不能随心所欲切换用户,而且每一次都要响应。所以我们是主动去连接服务器,从而都达到1对1,1对多,多对一的目的,可以聊天也可以把消息转换成指令。指令有哪些比如远程 *** 作,分享上传下载之类的。服务器接收到客户端的消息,指定目标客户端发送离线消息也可以。

刚刚开始使用flask框架写了两个小程序。然后我先访问了第一个“Hello,Web”的小程序,运行通过,然后想看看第二个inputname的程序是不是写对,但是linux报错:

socket.error: [Errno 98] Address already in use

大概意思就是地址被占用。因为socket默认是不支持地址复用的。为什么程序跑完了端口还是被占用着?这个问题就要TCP连接的“四次挥手”。

我们可能都有听过TCP/IP中“三次握手,四次挥手”,前者我们可能会更加了解一点,后者就不知道是什么样子。我也是T_T,所以我决定弄懂它。

在TCP/IP终止连接的四次握手中,当最后的ACK回复发出后,有个 2MSL 的时间等待,MSL指一个片段在网络中最大的存活时间,这个时间一般是30秒,所以基本上过60秒后就可以重新连接!

为什么要等待2MSL?是因为在最后发出ACK回复后,发送方不能确认ACK是否被另一端正常收到,如果另一端没有收到ACK回复的话,将会在1MSL后再次发送FIN片段。所以说发送方等待2MSL时间,也就是刚好它发ACK回复和对方发送FIN片段的时间,如果此时间内都没有再次收到FIN片段的话,发送方就假设对方已经正常接收到了ACK回复,此时它就会正常关闭连接!

以上就解释了为什么会出现跑另一个程序时会出现地址占用的情况。

接下去就是解决方案:

如果并发连接请求过多的时候,即短时间内连接请求很多,系统自动释放已占用端口的时间还没有到,又有连接请求(可用的端口已经被用完),所以还会出现 Address already in use错误提示),就会产生大量的TIME_WAIT状态的连接。这种情况下就有必要调整下linux的TCP/IP内核参数,让系统更快的释放TIME_WAIT连接。对于并发连接量大的情况我们需要这样设置:

这是你创建的套接字类型决定的,常用的套接字是数据流类型(TCP)和数据报文类型(UDP),创建这些类型的套接字的时候就已经带上了相应的协议栈,这些握手信息在协议栈内部就已经实现了,不需要上层应用去实现

如果你想自己去控制握手信息,需要创建原始套接字,这种类型的套接字是基于IP层的,很多抓包工具就是通过这种类型的套接字来实现的,在这一层上你就可以自己定义处理握手信息,但这样相当于你要自己来实现TCP协议栈了,这难度太高,而且一般情况下也没必要

如果只是对握手的过程感兴趣,安装一个抓包工具观察一下连接的时候C/S之间的通信数据包就可以了


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11336175.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存