最近一个项目因为要用到Socket传输问题,自己比较懒,没有去写。直接上网 search一下了,找到两个比较简单的
EMTASS2_1 原文地址:http://blog.csdn.net/hulihui/archive/2008/10/27/3158613.aspx
ZYSocketSuper 3.1 SOCKET框架 原文地址:http://blog.csdn.net/luyikk/archive/2010/12/26/6099337.aspx
根据他们各处带的实例,用了一天时间改成我想要的效果,发现了几个问题。
第一个网络传输服务框架
1、最主要的原因就是不能传输中文,
解决编码问题 把Encoding.ASCII.GetByte...., 改成Encoding.Default.GetBytes...
貌似可以了,但是在回传到客户端的时候就会有错误,也就是SendDatagram()这个过程出错,也就是这个过程 Encoding.Default.GetBytes(datagramText, 0, byteLength1, m_sendBuffer, bufferOffset);这个问题就是搞晕了我半天,最后换成别的方法改好,后面写出。
2、在服务端存储的列表中,TSessionCoreInfo中的Name属性不知道放在哪赋值,比方说客户端的Socket,我想对应一个名称,如客户端1.这样服务端根据这些key,value值这样的关系,显示各种状态(可以是图片通断状态)能够快速定义找到,但是不知道在哪传值。原方法是用ID来对应
3、自定义扩展的方法比较好,这样实合不同的方式来储存数据,采用消息传输各种结果。
第二个网络传输服务框架
1、如果是服务器断开(异常关闭),客户端就无法再次连上了。
2、客户端没有找到自己disconnect方法。
3、服务端没有判断在一个服务器上只能启一个,这个可以自己改(开源嘛,呵)
4、支持实体序列化传输,使用问题集合,方法集合等。
5、其实功能还是挺强的,支持加密传输内容
以上只是俺初玩的感觉,可能是没有深入,原作者都没有这些问题。
最后还是选择了第一个来操作,因为我需要改变消息格式就可以实现不同的结果,以后只是改消息就行了,再改一个解析消息类。
修改第一个框架中文的问题
在作网络通讯中,被这个转换Byte搞显了,因为要加一个缓冲存储概念,所以两具byte[] 相合并,并取值就出现问题了。
原来方法 是用:Encoding.Default.GetBytes(datagramText, 0, byteLength1, m_sendBuffer, bufferOffset);
其中:datagrameText为编码内容: <ok,客户端1,这是内容方式,也可以是XML编码等>
byteLenght1:为上面内容转换成byte[]后的长度
m_sendBuffer:为缓冲区
bufferOffset:为缓冲区开始从哪插入值
想要的结果是:如果m_senBuffer中无值,则是从0处(bufferOffset可以知道)插入值,否则从相应的索引处插入值,可是每次运行到此处就是报错,提示“对应的索引和值在指定的范围内”,就是没搞明白,研究了半天,改成一个笨方法来实现。
byte[] newBuffer = Encoding.Default.GetBytes(datagramText);
//与缓冲区数据合并,如果有的话 ,取消原来的方法 2011-5-18
newBuffer.CopyTo(m_sendBuffer, bufferOffset);
倒是调试过去了,还是没找到上面的问题所有。
但要是没有中文就可以过去,其中含有中文就错,原则上无论是多少字节组,我只是合并,应该问题不大才对呀。郁闷透顶。