日期:2014-05-18  浏览次数:21080 次

刚开始接触CS架构,没用过socket,大神能否快速科普一下。
百度过,不过感觉不能快速上手,需求:移动平台请求数据(crud都有),求一个DEMO,当然描述一下也行,用socket实现,不用webservice,我也说一下我的疑点吧,其实我也就看了一晚上,server端和client端直接和socket交互的是那一层?他们具体的职能是什么。。。大神们最好能给我个代码的框架,只有接口即可,实现可以不要,例如client实现一个最简单的crud。
好吧,我说一下我认为的逻辑(一直做bs开发,理解的不对请无视):UI→Controller(client端)→socket共通类(arg1:指令类型,arg2[]:参数列表)→Socket通信→Controller?(server端)[→BLL(Action,不知道有没有这一层)]→DAL(service)→DB Server
BLL(Action)这一层是不是 应该放在client对请求的数据进行编辑用的?我想知道socket通信实现方法应该在client和server的哪一层来调用?

------解决方案--------------------
如果你一定要用socket去做,建议你学webservice,用socket传递xml文本,client向server发出的各种命令,都用xml表示,server向client返回任何结果也都用xml文本表示,

这样你就可以把socket通讯独立出来,作为一个孤立的组建和业务逻辑层和数据层都无关,
------解决方案--------------------
所谓套接字,很多人说的只是指Windows Socket API以及在此之上封装的库函数(比如.net TCPClient UDPClient,mfc的CSocket,Delphi的Indy).
------解决方案--------------------
不过如果要这样做,还不如用http协议做,用http传输xml文件更为简单,如果用http协议,就和用webservice没多少差别,呵呵,

不管用什么方式,socket也好,http也好,只要你用xml文件做请求和应答,那么你可以决定在任何一个层次上做网络通讯,你可以把业务逻辑层放在服务器,然后client用xml调用服务器上的业务逻辑层,client只做界面,也可以把业务逻辑层放在client,用xml去调用服务器上的数据库,

但如果你用client直接访问数据层,那还不如就直接用ado.net直接从客户端访问数据库服务器,这也是最普通的cs结构程序的做法,也是最容易实现的做法,


------解决方案--------------------
探讨

用socket不用webservice主要是考虑到性能的问题,client肯定是不会直接访问服务器的,因为手机平台塞班、安卓、WP、IOS要公用这一个server。



------解决方案--------------------
以下或许是相当重要的入门知识,以免你以后对于通讯程序设计望洋兴叹。



知识层之一:
首先先要理解最基本的命令模式:
C# code
    public interface ICommand
    {
        object parameter { get; set; }
        object Execute();
    }

    public abstract class Command<T, S> : ICommand
    {
        public abstract S Execute(T parameter);

        public object Execute()
        {
            return Execute((T)parameter);
        }

        public object parameter{get;set;}
    }

------解决方案--------------------
我喜欢直接用ASP.Net HTTP Handler,轻量,我往.ashx这样的一个地址POST一个request class的json字符串,再接收一个response class的json序列化后的字符串,再反序列化得到response的内容。其实这就是个轻量级的service。

------解决方案--------------------
使用socket,特别是使用长连接异步处理,你会发现要比http通讯快许多倍,特别是输入参数和返回对象是比较复杂的自定义类型时。比WCF快多少倍我都懒的去比较了。

当然长连接异步异步处理在最基本的信令设计上要稍微复杂一点。简单说一下长连接:


例如这样的格式(序列号为ulong类型):
  
命令类型|发送端会话id|接收端会话id|序列号|json

这样当服务器端刚刚解析到“接收端会话id”不是自己时,就简单地发消息发送给对应的客户端就行了。而当消息确实是发送给自己的,它异步地执行json,然后将返回结果以格式
返回数据类型|服务器端id|客户端id|-序列号|json的格式返回。

比如说客户端与服务器端建立了连接之后,它可能按照次序1、2、3、4、5的次序发送了5命令,然后异步地以3、5、2、1、4的次序收到了返回结果(因为服务器端是异步执行这些命令的,这些命令所用时间长短不同,所以返回的次序不定),那么客户端需要一个异步机制,在收到命令返回时才去回调相应的命令的下一步处理程序。
------解决方案--------------------
"...(一直做bs开发,理解的不对请无视):..."有很好的基础耶,我们就拿browser和webserver来讨论。

browser和webserver之间的通讯也是SOCKET通讯,应用层使用HTTP协议(HTTP协议是基于TCP的,文本的),简单点你可以这样理解:browser向webserver发送字符串,一般80端口,TCP/IP通讯,webserver收到消息后给browser应答,然后挂机不里你了。深入点你研究下HTTP协议,用FIREFOX浏览器安装HTTP插件观察下GET、POST、RESPONSE时的内容。 

OK,然后我们来说你的“CS架构”。其实,前面那段 browser和webserver之间的通讯 就是“CS架构”。他和你这里要求的“CS架构”差别在于BS传输时使用了HTTP协议,而你的DEMO想用你自创的武功。
说句废话,绝顶的高手们(注意们字)创建功夫流派,真正高手喜欢使用某流派,一般人喜欢使用自创的流派。

怎么个自创法呢,TCP通讯,服务器在某个端口侦听外面的电话(把客户端比喻成电话),你拨通了服务热线,服务器就建立了一条通信的管道(SOCKET)为您服务,他自己则继续侦听。。。你在热线中的通话,可以自由地和接线员打情骂俏,发送图片、病毒、EXE等都可以(一切数据皆文件或者01010101,这个不用我再说了吧),只要这些内容遵循你自创的协议。TCP保证你们的通信是传输内容正确、顺序正确的。当前通话怎样挂机呢,3种情况:1、我拍拍屁股挂了;2、受不了你的骚扰对方把你挂了;3、电话线被人断了。BS是接了电话,根据你的请求,发个回应就马上把你挂了。你认为这样比BS爽多了吗?其实不然,维护这么条通信管道太昂贵了,这个话费我吃不消。另外,分机号如果不是80端口也很难拨通(路由器、防火墙。。。),所以在大规模的系统中我不喜欢这样的模式(个人喜好)。
另外,
UI→Controller(client端)→socket共通类(arg1:指令类型,arg2[]:参数列表))→(遵循HTTP协议的字符串)→Socket通信→Controller?(server端))→(遵循HTTP协议的字符串)→[→BLL(Action,不知道有没有这一层)]→DAL(service)→DB Server