Socket通信中服务端如何响应大规模的客户端请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket通信中服务端如何响应大规模的客户端请求相关的知识,希望对你有一定的参考价值。

1.每次有数据要发送时请求建立连接,数据发送完后,关闭连接。存在的问题是短时间内有间断的数据发送时,频繁的建立与撤销,会使得服务端响应不过来,那该如何解决?WEB服务器(IIS,Apache)是如何响应浏览网页时客户的点击的?
2.如果从客户端第一次发送数据时一直保持连接,则此连接大多数情况下是闲置的,又会造成服务器资源的浪费,不知道有没有检测连接是否闲置的方法,定期将闲置的连接关闭?
3.若有更好的意见与建议,请你告诉我,谢谢,视情况给予加分奖励。

1、对于大规模的客户请求,windows下用IOCP,linux下采用epoll模型,具体你可以上网去搜,涉及的内容较多,这里不讲了。这里有个我写的epoll的模型
famdestiny.cublog.cn

2、针对短时间数据发送,最好的办法是开一个线程池,每接收到一个请求就交给线程池处理,这样能防止启动结束线程带来的额外开销,是比较高效的。
参考技术A 1.可以用多线程解决。用一个线程负责接收连接,接收后交给其他线程处理。WEB服务器是通过处理表单实现对客户点击的响应的。也可以使用阿贾克斯解决。
2.c#中可以使用socket类的connected属性。
3.可以在网上找一些源码做参考。

Socket是如何通信的?

问题描述

客户端连接的是服务端的80端口,所有的数据都发送给80端口,这个时候,tcp协议中的端口是80。但是服务端只是监听80端口,然后使用一个新的socket和客户端通信,新的socket端口是重新分配的,假设端口号分配的是12345,服务端将响应数据从这个端口发送出去,长连接建立起来之后,服务端从新的12345端口接受数据,但是客户端还是将数据发送到80端口(因为客户端创建套接字的时候,只知道服务端公开的端口是80),那么服务端是怎么在新的12345端口上获取数据的?换句话说,客户端tcp协议的目的端口是80,12345端口如何收到发送到80端口的数据?

 

 



题主犯了“唯心主义”错误,凭借天马行空的想象力,服务器应该用一个全新的端口号(不同于80端口)来服务客户端,到最后自己怀疑自己。

 

首先,服务器依然会使用80端口号来服务客户端,这样当服务器响应的报文到达客户端时,客户端会检查四元组,源IP、目的IP、源端口、目的端口,看看是否和发出去的报文完全匹配。

 

将接收到四元组计算出相应的Socket ID,用ID做为关键字检索Socket数据库:

 

  • 检索成功,用检索到的Socket来处理接收报文

  • 检索失败,丢弃处理

 

很显然,如果服务器不使用80端口做为源端口,客户端将检索失败,丢弃处理。这样TCP连接永远都无法建立起来。

 

其实服务器的处理和客户端大同小异,分三个逻辑分支:

 

  • 检索成功,用检索到的Socket来处理接收报文

  • 检索失败,服务器侦听(listen)目的端口,创建全新的Socket服务客户

  • 检索失败,服务器没有侦听目的端口,丢弃处理

 



客户端与服务器端的身份并没有天然差异,差别就在于是否在某个端口侦听,愿意为别人提供服务。如果客户端在某个端口侦听,那它已经是服务器了,要采用服务器三分支的逻辑分析问题。

 

对于这些基础知识点,最好的方法还是找本经典的教材,踏踏实实地学习,站在前人的肩膀上,能让自己看得更高、更远!

以上是关于Socket通信中服务端如何响应大规模的客户端请求的主要内容,如果未能解决你的问题,请参考以下文章

web框架的本质

Socket是如何通信的?

android--------Socket的简单了解

Djangoweb框架的本质

Java Socket入门

Django初识(web框架,django下载安装,http协议)