基础Socket

自强的程序猿们都喜欢搞Socket,而且觉得最好自己来封装个组件出来,如果再往上,加入某种数据协议,让上层服务器开发照着此协议走,就是一个小小的框架了。于是,从头开始,最开始的服务器的雏形与下图有一些相似。

现在服务器可以通过socket1到n,分别发送二进制数据到达对应的client1到n了,如果服务器的设计到此打住,本文也就到此打住了,但这个的服务器,毕竟离实际可以拿来作某种服务太遥远了,就于就有了更深层次的封装和扩展。

两种封装和扩展

第一种:保留Socket1到n不变,扩展ListenerServer

例如,现在有一个需求,要服务器发到客户端的数据内容为某些对象序列化后的JSON文本UTF8转码后的二进制,通过继承ListenerServer,我们可以封装一个SendJson的方法

    public class JsonServer : ListenerServer
{
public void SendJson(Socket socket, object model)
{
var javaScriptSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var json = javaScriptSerializer.Serialize(model);
this.SendJson(socket, json);
} public void SendJson(Socket socket, string json)
{
var buffer = Encoding.UTF8.GetBytes(json);
socket.Send(buffer);
}
}

到此,这种设计感觉依然”完美“,如果往上抽象一层,加入某种协议,基础的ListenerServer的就设计为ListenerServerBase<T> where T:IProtocol,IProtocol形成协议约束。

让我说,我觉得这种设计基本能解决问题,但职责不单一,会造成上层通讯相关代码和业务服务API代码会偶合在一起,无法分离,因为所有返回数据流,都深深依赖于ListenerServer这个对象。假设ListenerServer为IIS,socket1到n为HttpContext,那么我们的业务API代码就依赖于IIS而不是依赖于HttpContext了,但写了这么多年Asp.net程序,没有人能引用IIS程序集,调用IIS.Instance.Response.Write("这是服务器回复的内容“)如此的代码吧!

第二种

ListenerServer只作监听,而socket1到n作类似HttpContext一样封装,在此且命名为Session会话,如下图

现在解决刚才的JSON需求的SendJson的方法如下:

    public class JsonSession : Session
{
public void SendJson(object model)
{
var javaScriptSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var json = javaScriptSerializer.Serialize(model);
this.SendJson(json);
} public void SendJson(string json)
{
var buffer = Encoding.UTF8.GetBytes(json);
base.Send(buffer);
}
}

到这里,感觉逻辑通顺多了,得到一个session会话实例,就可以调用session.SendJson(json)了,不依赖于ListenerServer。而基础ListenerServer可以设计为ListenerServer<T> where T:Session,加入的协议在Session的派生类完成。

本文只代码作者观点,如果你想继续深入第二种扩展方法,可以参考我的一个socket组件:NetworkSocket

那些不好的Socket服务器设计的更多相关文章

  1. 再次回首 TCP Socket服务器编程

    转载:http://www.cnblogs.com/zc22/archive/2010/06/27/1766007.html ------------------ 前言 --------------- ...

  2. Socket服务器整体架构概述

    转载:http://www.cnblogs.com/tianzhiliang/archive/2010/10/28/1863684.html Socket服务器主要用于提供高效.稳定的数据处理.消息转 ...

  3. 可扩展多线程异步Socket服务器框架EMTASS 2.0 续

    转载自Csdn:http://blog.csdn.net/hulihui/article/details/3158613 (原创文章,转载请注明来源:http://blog.csdn.net/huli ...

  4. 经过一年时间的沉淀 再次回首 TCP Socket服务器编程--转

    ------------------ 前言 ------------------ 开发了这么多年,发现最困难的程序开发就是通讯系统. 其他大部分系统,例如CRM/CMS/权限框架/MIS之类的,无论怎 ...

  5. FPS游戏服务器设计的问题 【转】

    一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击游戏),你是要用TCP呢还是要用UDP,说明理由 . 二.学习 这是两篇网上找到的文章,写非常不错. 当时笔试的时 ...

  6. 异步Socket服务器与客户端

      本文灵感来自Andre Azevedo 在CodeProject上面的一片文章,An Asynchronous Socket Server and Client,讲的是异步的Socket通信. S ...

  7. windows下的C++ socket服务器(1)

    windows下的一个C++ socket服务器,用到了C++11的相关内容,现在还不是很完善,以后会不断改进的! #include <winsock2.h>//1 以后会用这种方式对特定 ...

  8. 转 C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)

    原创性申明 本文作者:小竹zz  博客地址:http://blog.csdn.net/zhujunxxxxx/article/details/43573879转载请注明出处引言 我一直在探寻一个高性能 ...

  9. 可扩展多线程异步Socket服务器框架EMTASS 2.0

    0 前言 >>[前言].[第1节].[第2节].[第3节].[第4节].[第5节].[第6节] 在程序设计与实际应用中,Socket数据包接收服务器够得上一个经典问题了:需要计算机与网络编 ...

随机推荐

  1. 【mysql】关于innodb中MVCC的一些理解

    一.MVCC简介 MVCC (Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代 ...

  2. HDU 4043 FXTZ II (组合数学-排列组合)

    FXTZ II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  3. SQL将用户表中已存在的数据所有姓名(汉字)转换为拼音首字母

    实现方法: --函数 Create function [dbo].[fn_GetPy](@str nvarchar(4000)) returns nvarchar(4000) --用于加密 --WIT ...

  4. 复制文件的bat脚本

    数据库备份到不同的机器上的一段脚本 使用系统的copy 命令来复制单个文件 如果要复制某个文件夹,则使用xcopy 命令 set date=%Date:~0,4%%Date:~5,2%%Date:~8 ...

  5. ASP.NET5 MVC6入门教学之一(自己动手)

    等待微软开源大动作已经好几年了,终于ASP.NET 5发布了.今天给新手们写一个简单地教程,教你认识一下ASP.NET5 MVC6 1.安装kvm 首先,你需要以管理员权限打开cmd,执行如下的脚本: ...

  6. sigemptyset,sigfillset,sigaddset,sigdelset,sigismember,sigprocmask,sigpendmask作用

    SYNOPSIS #include <signal.h> int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); in ...

  7. 怎样用ZBrush雕刻人体造型

    之前我们通过学习使用ZBrush®中的Curves和Insert笔刷快速创建模型的躯干.四肢以及手指.经过老师耐心的讲解我们也收获了很多,知道了创建模型的流程和雕刻技巧.今天的ZBrush教程我们将结 ...

  8. CSS 属性 :before && :after的用法,伪类和伪元素的区别

    一::before && :after的用法 :before 如同对伪元素的名称一样,:before 是用来给指定的元素的内容前面插入新的内容.举例说明: .before:before ...

  9. UESTC 876 爱管闲事 --DP

    题意:即求给定n个数字(a1,a2,……an),不改变序列,分成M份,使每一份和的乘积最大. 思路:dp[i][j]表示把前i个数字,分成j份所能得到的最大乘积. 转移方程:dp[i][j] = ma ...

  10. JS 浮点数运算丢失精度解决方案

    除法 function accDiv(arg1,arg2){ var t1=0,t2=0,r1,r2; try{t1=arg1.toString().split(".")[1].l ...