您的位置:首页 > 理论基础 > 计算机网络

服务器网络编程注意事项

2017-11-07 17:30 274 查看

不管什么服务器,也不管你用什么语言开发服务器。这些都要注意。(如果方法不一样,那只是语言给你封装好了。)

每个服务器在创建 的时候 都会 有 Listen这个或者功能。服务器开始监听链接。其中里面有个int 类型的参数。我在之前一直以为,这个int类型 表示的 是 可以链接的客户数量,其实不然,这个是每毫秒可以用户访问的并发数量。 比如,在同一毫秒时间宽度内,有三个客户同时链接,而这个参数确实2。那么这一毫秒他就只接收两个客户的请求。

然后会调用
accept
这个方法。 通常会有一个参数是你 刚才已经在监听模式的Socket的句柄。 还有两个参数会是链接进来的客户端的 地址。 然他会有一个返回值。或者你所使用的语言已经封装了这个返回值。 这个不重要 。 重要的是,每次有个新用户链接, 他都会重新生成一个新的Socket 的 句柄,用来专门和这个客户端进行收发数据和关闭链接等等操作。 而 第一次原先的那个socket 还会进行他等待其他客户端链接请求的使命。

(2)中我们知道。每次一个客户端的链接,都是实例一个新的Socket,而每一个Socket 都是会占用一个端口的,只是他在实例的时候会自动选择未被占用的端口。这样,如果你的游戏服务应用,数据库服务应用,什么商场服务应用,用户信息服务应用等等……各种服务应用都在一个服务器上面运行。这样就会很消耗服务器的承载量,会造成明显的延时卡顿,如果你使用了各种优化,各种策略之后还是会造成极大的网络延时,那么,就把他们 分别部署到不同的 服务器上面吧

大型网络游戏,如果客户访问量够大的话,需要引用一个
集群化
的方法,把所有链接请求分发出去。所有的服务器 由功能可以分为“前置接收任务”,“后置处理任务”两组服务器。“接收任务”负责接收客户端的 任务请求,然后查看 “处理任务“服务器组那个服务器空闲,空闲则直接由这个 服务器 来完成 用户 ”任务“。这样就可以保障一台服务器概念下永远不会超过自己的承载量。

要注意的是在数据的收发方法
int send(...); int recv(...);
中。(C++语言)其中参数 类型
Char*
是表示提供数据缓冲的类型。虽然函数原型中注明是
Char*
类型,但是实际上可以接收任何类型的缓冲指针并做强制类型转化即可


那为什么还要用
Char*
这一类型呢,其实在在早期的时候 C++语言中没有
Void*
这个概念。然后后期才加入的。而这个
Void*
在C++语言中又明确规定: 任何类型的指针,都可以转化为
Void*


那么其实,这个
Char*
你完全可以看做是
Void*


在收发数据的时候需要注意。一方调用Send发送的时候,另一方应该调用Recv接收。如果两端同时 Send 或者 Recv 那么稍后一端的调用就会失败。 如果Recv调用指定的缓冲过于小的时候,一般这时候返回值是实际接收的字节数,当这个值等于缓冲长度的时候,要考虑循环调用Recv直到返回值小于缓冲长度,以接收所有的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: