supersocket实际应用之你画我猜游戏(一)
supersocket这款组件,让不懂tcp/ip的人都能开发出网络应用。我们不必在开发与自己主要应用不相关的代码了,主要精力都能放在设计业务逻辑上面了。 现在使用现成又完备的组件,真是大大的提高了开发效率。我主要使用的是1.6.5版本的supersocket,用于编写.net framework下的wpf和winform应用。我正在进行的你画我猜玩具项目也只是作为周末的消磨时间的一种方式。另外写winform写多了,写wpf都还像在写winform一样,不过wpf的ui还是具有更强的展示能力。
supersocket v1.6源码地址:https://github.com/kerryjiang/SuperSocket/tree/v1.6
在用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>());
配置监听:
View Code

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();
分类:
C#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端