supersocket这款组件,让不懂tcp/ip的人都能开发出网络应用。我们不必在开发与自己主要应用不相关的代码了,主要精力都能放在设计业务逻辑上面了。 现在使用现成又完备的组件,真是大大的提高了开发效率。我主要使用的是1.6.5版本的supersocket,用于编写.net framework下的wpf和winform应用。我正在进行的你画我猜玩具项目也只是作为周末的消磨时间的一种方式。另外写winform写多了,写wpf都还像在写winform一样,不过wpf的ui还是具有更强的展示能力。
 
在用nuget引用supersocket时,注意组件之间的依赖关系,不然会在使用时出现某个依赖项找不到的问题。因为supersocket引用的组件的签名和自己项目引用的组件的签名不一样造成的。这也是.net为了防止组件被替换为不安全的组件所采取的方式。但这也让许多开发者都有一段头疼的经历。
服务端引用的组件有:
我为了调试,就引用的是源码中的项目了。
客户端的引用:
SuperSocket,supersocket.clientEngine,supersocket.protobase,supersocket.common
 
supersocket服务端几个重要的对象:AppServer,Appsession,IRequestInfo,FixedHeaderReceiveFilter。下面就来分别介绍这几个对象。
 
IRequestInfo是接收实际数据的接口,默认采用StringRequestInfo。我自己定义了一个接收自己的数据类型:

public class DataRequestInfo : IRequestInfo
{
public string Key { get; set; } public byte[] Data { get; set; }
public byte[] DataSend { get; set; }
public DataRequestInfo(string key,byte[] header, byte[] bodyBuffer)
{
Key= key;
int length = ByteConvertHelper.byteArrayToInt(header); Data = new byte[length]; Array.Copy(bodyBuffer, 0, Data, 0, length);
DataSend=new byte[length+4];
Array.Copy(header, 0, DataSend, 0, header.Length);
Array.Copy(bodyBuffer, 0, DataSend, header.Length, bodyBuffer.Length);
} }
Appsession:是连接服务器的一个会话,支持继承。当客户端连接上服务端后,服务端就会产生一个Appsession

public class PaintAppsession : AppSession<PaintAppsession, DataRequestInfo>
{
public string IDKey { get { return base.SessionID; } }
// public string NickName { get; set; } public ClientPlayerInfo ClientPlayerInfo { get; set; }
public bool isReady { get; set; }
protected override void HandleException(Exception e)
{
// var a = e;
}
}
AppServer就表示服务端了,也支持继承,AppServer这种是抽象类,必须自己继承。

 public class PaintAppServer : AppServer<PaintAppsession, DataRequestInfo>
{ public PaintAppServer(IReceiveFilterFactory<DataRequestInfo> protocol) : base(protocol)
{
}
}
FixedHeaderReceiveFilter表示接收头部固定长度的字节,头部header长度定义为4,每次发送的字节前4个的自己是可以自己定义的,比如存发送的数据包的大小。这个类的作用是把从网络中收到的字节组装成DataRequestInfo。

internal class MyServerReceiveFilter : FixedHeaderReceiveFilter<DataRequestInfo>
{
public MyServerReceiveFilter(): base(4)
{ }
protected override int GetBodyLengthFromHeader(byte[] header, int offset, int length)
{
var data=new byte[length];
Array.Copy(header, offset, data, 0, length); var len = ByteConvertHelper.byteArrayToInt(data); return len;
} protected override DataRequestInfo ResolveRequestInfo(ArraySegment<byte> header, byte[] bodyBuffer, int offset, int length)
{
var data = new byte[length];
Array.Copy(bodyBuffer.ToArray(), offset, data, 0, length); return new DataRequestInfo("key1",header.ToArray(), data);
} public override DataRequestInfo Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest)
{
return base.Filter(readBuffer, offset, length, toBeCopied, out rest);
} }

使用:

appServer = new PaintAppServer(new DefaultReceiveFilterFactory<MyServerReceiveFilter, DataRequestInfo>());
配置监听:

IServerConfig m_Config = new ServerConfig
{
Port = port,
Ip = "Any",
MaxConnectionNumber = 1000,
Mode = SocketMode.Tcp,
Name = "CustomProtocolServer",
MaxRequestLength = 10240 }; if (appServer.Setup(m_Config, logFactory: new ConsoleLogFactory())){;}
打开:
appServer.Start();

supersocket实际应用之你画我猜游戏(一)的更多相关文章

  1. Vue+WebSocket+ES6+Canvas 制作「你画我猜」小游戏

    Vue+WebSocket+ES6+Canvas 制作「你画我猜」小游戏 转载 来源:jrainlau 链接:https://segmentfault.com/a/1190000005804860 项 ...

  2. Node学习笔记(三):基于socket.io web版你画我猜(一)

    经过惨淡的面试,也是知道了自己的不足,刚好最近在学习node,心中便有了做一个web版的你画我猜的想法 首先说下思路,在做准备工作的时候,有两个大概的思路: 1.规定一块div,捕捉鼠标事件,动态生成 ...

  3. java 你画我猜 了解一下

    0-设计思路: 你画我猜顾名思义,有一个人画,一个人猜,两个思路: 1)一个中央服务器,中转数据,两个client端:,a画对应点的数据通过服务器发给客户端b,b通过这些数据进行绘画,换颜色人,等等, ...

  4. Node学习笔记(三):基于socket.io web版你画我猜(二)

    上一篇基础实现的功能是客户端canvas作图,导出dataURL从而实现图片信息推送,下面具体讲下服务端的配置及客户端的配置同步 首先先画一个流程图,讲下大概思路 <canvas id=&quo ...

  5. 基于j2ee的程序代写MVC架构

    人力资源管理系统 完成系统静态页面设计,页面数量不少于10个,页面需用CSS进行美化,并为需要验证的信息利用JavaScript提供客户端验证.要求至少包含部门信息及部门内员工信息的添加.修改.删除和 ...

  6. 如何从“点子”落地到“执行”?—完整解析1个手游传播类mini项目的进化

    本文来自网易云社区 作者:林玮园 从点子到落地,是不确定到确定的过程,是从模糊概念到具体现实的实现过程.无论什么点子,在落地变现的过程中都会有很多疑问产生. 首先,不确定点子本身是否成立.点子的背后是 ...

  7. 用 Java 做个“你画手机猜”的小游戏

    本文适合有 Java 基础的人群 作者:DJL-Lanking HelloGitHub 推出的<讲解开源项目>系列.有幸邀请到了亚马逊 + Apache 的工程师:Lanking( htt ...

  8. 七牛CEO许式伟:移动游戏资源存贮的大趋势

    (国内知名Android开发论坛eoe开发者社区推荐:http://www.eoeandroid.com/) 9月14日,eoe移动开发者大会正式在北京国家会议中心召开,七牛云储存CEO许式伟先生做了 ...

  9. 项目游戏开发日记 No.0x000001

    14软二杨近星(2014551622) 既然已经决定了开发软件, 时不时就要练练手, 还要时不时的去寻找素材, 因为开发的人物设定就是DotA2里面的祈求者, 所以, 就去找了他的相关人物图片和模型, ...

  10. 【python游戏编程之旅】第一篇---初识pygame

    本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 一.pygame简介 Pygame 是一组用来开发游戏软件的 Python 程序模块,基于 SDL 库的基础 ...

随机推荐

  1. HMS Core分析服务智能运营,“智能时机”上线,轻松提升Push点击

    对于运营者来说,消息推送一直是提升用户活跃与转化的重要工具,如何在提升转化的情况下,同时不降低用户的接受程度,这一直是运营不断追求的目标. 好的推送不只在于优质的推送内容,还需要把握合适的时机.在合适 ...

  2. DevEco Device Tool 3.1 Release新版本发布,新增资源管理器、SFTP、HDC

     原文链接:https://mp.weixin.qq.com/s/UGBirjf8nBjnfKck9TlyWg,点击链接查看更多技术内容:   DevEco Device Tool是面向智能设备开发者 ...

  3. HarmonyOS 3百机升级计划,来了!

    HarmonyOS 3规模升级来了! 为大家奉上百余款机型升级计划! 你的手机什么时候可以升级? 赶快下滑查看!

  4. 最全能的AI换脸软件,FaceFusion下载介绍(可直播)

    FaceFusion是一款多功能的AI换脸软件,它不仅能图片.视频换脸,还可以直播换脸,换脸效果真实.自然 与大多数换脸软件不同的是,FaceFusion不仅支持N卡处理程序(Azure),还额外提供 ...

  5. spark 计算前后两条记录之间的差(diff),时间差等

    有时候会遇到这样的场景:有一个datafram,我们需要计算同一组对象中,前后两条记录之间的差值,此处并不仅限于时间,还可以是其他的数据类型 需要用到两个工具:spark窗口函数Window对对象分组 ...

  6. 墨水污染的一角qsnctfwp

    题目附件 在图片中最直接的信息是电话号码,将号码输入到搜索引擎,可以得到该书的出版社为:高等教育出版社. 进入高等教育出版社官网 根据物料号前四位.版次时间.印次时间,在官网中进行图书查询. 结合字数 ...

  7. Flutter笔记 - 事件分发

    事件处理流程 Flutter 事件处理流程主要分两步,为了聚焦核心流程,我们以用户触摸事件为例来说明: 命中测试:当手指按下时,触发 PointerDownEvent 事件,按照深度优先遍历当前渲染( ...

  8. 转载(localStorage设置过期时间)

    转载地址:https://blog.csdn.net/zhaoxiang66/article/details/86703438 class Storage{ constructor(name){ th ...

  9. Oracle nullif函数使用

    nullif函数使用 简单来说,就是表达式1的值和表达式2的值进行对比 可以使用''字符 select nullif('','1111') from dual 输出为空 不可以使用null字符 sel ...

  10. 剑指offer03(Java)-数组中重复的数字(简单)

    题目: 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任 ...