中易网

基于Websocket的在线客服系统适不适合使用M

答案:2  悬赏:0  
解决时间 2021-12-31 19:07
基于Websocket的在线客服系统适不适合使用M
最佳答案
数据传输的过程:
  建立连接后,TCP协议提供全双工的通信服务,但是一般的客户端/服务器程序的流程是由客户端主动发起请求,服务器被动处理请求,一问一答的方式。因此,服务器从accept()返回后立刻调用read(),读socket就像读管道一样,如果没有数据到达就阻塞等待,这时客户端调用write()发送请求给服务器,服务器收到后从read()返回,对客户端的请求进行处理,在此期间客户端调用read()阻塞等待服务器的应答,服务器调用write()将处理结果发回给客户端,再次调用read()阻塞等待下一条请求,客户端收到后从read()返回,发送下一条请求,如此循环下去。
  如果客户端没有更多的请求了,就调用close()关闭连接,就像写端关闭的管道一样,服务器的read()返回0,这样服务器就知道客户端关闭了连接,也调用close()关闭连接。注意,任何一方调用close()后,连接的两个传输方向都关闭,不能再发送数据了。如果一方调用shutdown()则连接处于半关闭状态,仍可接收对方发来的数据。
  在学习socketAPI时要注意应用程序和TCP协议层是如何交互的:
  *应用程序调用某个socket函数时TCP协议层完成什么动作,比如调用connect()会发出SYN段
  *应用程序如何知道TCP协议层的状态变化,比如从某个阻塞的socket函数返回就表明TCP协议收到了某些段, 再比如read()返回0就表明收到了FIN段.
  最简单的TCP网络程序
  Service.c 的作用是从客户端读字符,然后将每个字符转换为大写并回送给客户端。


  int socket(int family, inttype, int protocol);
  socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描述符,应用程序可以像读写文件一样用read/write在网络上收发数据,如果socket()调用出错则返回-1。对于IPv4,family参数指定为AF_INET。对于TCP协议,type参数指定为SOCK_STREAM,表示面向流的传输协议。如果是UDP协议,则type参数指定为SOCK_DGRAM,表示面向数据报的传输协议。protocol参数的介绍从略,指定为0即可。
  int bind(int sockfd, conststruct sockaddr *myaddr, socklen_t addrlen);
  服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接,因此服务器需要调用bind绑定一个固定的网络地址和端口号。bind()成功返回0,失败返回-1。
  bind()的作用是将参数sockfd和myaddr绑定在一起,使sockfd这个用于网络通讯的文件描述符监听myaddr所描述的地址和端口号。前面讲过,struct sockaddr *是一个通用指针类型,myaddr参数实际上可以接受多种协议的sockaddr结构体,而它们的长度各不相同,所以需要第三个参数addrlen指定结构体的长度.
  int listen(int sockfd, intbacklog);
  典型的服务器程序可以同时服务于多个客户端,当有客户端发起连接时,服务器调用的accept()返回并接受这个连接,如果有大量的客户端发起连接而服务器来不及处理,尚未accept的客户端就处于连接等待状态,listen()声明sockfd处于监听状态,并且最多允许有backlog个客户端处于连接待状态,如果接收到更多的连接请求就忽略。listen()成功返回0,失败返回-1。
  int accept(int sockfd, structsockaddr *cliaddr, socklen_t *addrlen);
  三方握手完成后,服务器调用accept()接受连接,如果服务器调用accept()时还没有客户端的连接请求,就阻塞等待直到有客户端连接上来。cliaddr是一个传出参数,accept()返回时传出客户端的地址和端口号。addrlen参数是一个传入传出参数(value-result argument),传入的是调用者提供的缓冲区cliaddr的长度以避免缓冲区溢出问题,传出的是客户端地址结构体的实际长度(有可能没有占满调用者提供的缓冲区)。如果给cliaddr参数传NULL,表示不关心客户端的地址。
  由于客户端不需要固定的端口号,因此不必调用bind(),客户端的端口号由内核自动分配。注意,客户端不是不允许调用bind(),只是没有必要调用bind()固定一个端口号,服务器也不是必须调用bind(),但如果服务器不调用bind(),内核会自动给服务器分配监听端口,每次启动服务器时端口号都不一样,客户端要连接服务器就会遇到麻烦。
  int connect(int sockfd, conststruct sockaddr *servaddr, socklen_t addrlen);
  客户端需要调用connect()连接服务器,connect和bind的参数形式一致,区别在于bind的参数是自己的地址,而connect的参数是对方的地址。connect()成功返回0,出错返回-1。

  sockaddr数据结构
注:更多精彩教程请关注三联电脑教程栏目,三联电脑办公群:189034526欢迎你的加入
全部回答
socket.io封装了websocket,同时包含了其它的连接方式,比如ajax。原因在于不是所有的浏览器都支持websocket,通过socket.io的封装,你不用关心里面用了什么连接方式。 你在任何浏览器里都可以使用socket.io来建立异步的连接。socket.io包含了服务端和客户端的库,如果在浏览器中使用了socket.io的js,服务端也必须同样适用。如果你很清楚你需要的就是websocket,那可以直接使用websocket
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
盗采的意思是什么?盗采的释义是什么啊?
花甲怎么做用 什么调料?????
快递寄东西要怎么做?是不是首先联系快递上门
北京电影学院2016年动画系校考成绩什么时候公
烦兴的意思是什么啊?请解释下!
怎么肢解不疼
回船轉舵的意思是什么?回船轉舵的释义是什么
写同学的五十字作文
上海虹桥机场到宝山区同济路怎么走
崩坏3新武器超重剑王蛇怎么样 超重剑王蛇
花市的意思是什么啊?请解释下!
麦当劳有哪些套餐?详细点!
白镪的意思是什么?白镪的释义是什么啊?
台服tera怎么冲月卡 说的详细点 一步一步的
美国犹他州怎么样
推荐资讯
焚骨扬灰的意思是什么啊?请解释下!
燕郊步行街苹果直营店那个是真的
上饶茶亭镇有考c2的驾校吗
中国体育彩票(一道街与新建街交叉口西南50米
敦肅的意思是什么?敦肅的释义是什么啊?
雨中冒险黄金宝箱怎么拿
丰翔社区居委会地址有知道的么?有点事想过去
若彼岸繁花落尽 谁陪我看落日流年 下一句 怎
消泄的意思是什么?消泄的释义是什么啊?
为什么大家都去中源协和基因做检测?
设随机变量X与Y相互独立,且都服从参数为1的指
中国平安保险刚缴费一年,想退保,可以吗?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?