龙空技术网

WEB开发进阶(07)(Socket编程)

不正经的程序员 101

前言:

此刻姐妹们对“c web socket”可能比较关注,各位老铁们都需要知道一些“c web socket”的相关知识。那么小编同时在网上搜集了一些对于“c web socket””的相关内容,希望你们能喜欢,小伙伴们一起来学习一下吧!

今天真的有点累了,加班到半夜,刚升级了新的服务,刚好涉及socket,顺便分享一下。

WEB世界大放异彩,离不开socket,因为WEB服务本身是一种基于TCP的Socket服务,只要涉及到网络通讯,无论WEB还是软件,socket在所难免,而WEB进阶,做更好的服务,不用说了,一定会接触和使用socket.

之前的文章中也讲过了一些端口的概念,每个应用在使用socket的时候要先定好端口,这样系统才知道把数据包传给哪个程序,那么接下来,让我们深入一下

协议

socket在应用层可以选择 TCP 和 UDP 2种协议,大家不用多深入,只需要记住,底层来说,TCP有握手的动作,从而建立连接,而UDP严格来说只是打通了这条网路地址而已。

基本操作

既然是网络通讯,那么,就会有2个功能,一个是收 一个是发,专业点,一个是监听端口,liston,等数据包到系统级别再回调处理,另一个是主动 send.这里需要提醒一点,做socket编程,那么我们的应用一定是多线程的,这样才不会堵塞,比如我定义好socket的监听回调方法后,可能还会定义一个计划任务,去同步心跳,那么这2个程序肯定是同时在跑,这里就有一个问题了,就是上一篇文章中所提到的多线程问题,如果你使用的语言支持多线程开发,那没问题,但如果不支持,就像PHP一样,原生并不支持,那程序就得特殊写了。

我拿PHP编写IM举例,首先,socket监听其实是通过死循环去读取socket连接缓冲区的包数据,这个数据包在定义读取的时候有大小限制,这样不至于被数据传输太大的时候死掉,而且,数据包也会被分为特定大小数据帧进行传输,或者结尾带上EOF,来判断数据流的完毕,那么我们在实现A发送消息给B的时候,其实就是监听获取了一个消息,内容是A要发送给B的,于是在保持的连接中寻找B是否有socket连接了,有就向他发送消息。

那么问题来了,第一,如果程序在接收到A的请求,把他的消息发送给B的时候,又有新的用户C发送消息过来,或者是新的用户连接socket过来了会怎么样呢?这里就体现出PHP本身不支持多线程模型的缺点了,所有消息都是堵塞的,除非已经把A的消息发给了B。所以我们编写的程序,需要尽量快的处理接收到的消息,这是做IM这关中的关键,怎么样提高负载,性能。

问题二,我系统需要定时做心跳,主动发送心跳包给所有连接的用户,确定他们的连接情况,看看socket是否断开,但是主动这个步骤从哪运行呢?在每次客户发来消息,监听的时候吗?那消息多的时候,我不就无法主动了吗?

前面2个问题,其实并不是socket的问题,是关于多线程和如何编写socket服务的问题,无论用支持多线程的语言,还是不支持的,如PHP,如果你了解了他的原理,都可以找到方法实现。

在接入多种终端的时候,我们往往要做很多客户接连的服务,比如websocket,socket,针对苹果发送推送的服务,针对微信主动推送的服务等等,这个在上篇多线程中有上传过架构图

我们需要拆解整个IM服务,推送的做推送,socket及时的做及时,还有存储的,日志的服务等等,这个过程中会用到很多消息队列。

标签: #c web socket