网站公告 | 全新unity3d 完整学习路线,最强课程配套、服务!详情点击
查看: 13469|回复: 36
收起左侧

[旅行的拾荒者] 使用SuperSocket框架实现简单的服务器和客户端网络通信【一】

  [复制链接]

[旅行的拾荒者] 使用SuperSocket框架实现简单的服务器和客户端网络通信【一】  [复制链接]

旅行的拾荒者 发表于 2017-3-27 16:20:19 [显示全部楼层] 回帖奖励 |倒序浏览 |阅读模式 回复:  36 浏览:  13469
SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架。你无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket 如何工作,但是你却可以使用 SuperSocket 很容易的开发出一款 Socket 服务器端软件,例如游戏服务器,GPS 服务器, 工业控制服务和数据采集服务器等等。
其他的就不介绍了,代码里面全部都有注释。
看代码就行了,代码很少。服务器端Demo是使用WPF做的(VS2017),客户端没有,测试代码可以使用Telnet(开启方式--程序和功能--启用或关闭Windows功能--找到Telnet客户端勾选上--点击确定)。Telnet使用方法--Win+R--输入CMD--命令台输入telnet localhost 2017
注:2017是端口号
服务器的初始化
[AppleScript] 纯文本查看 复制代码
using SuperSocket.SocketBase.Config;
using System.Windows;
using WpfSuperSocket.SuperSocket;

namespace WpfSuperSocket
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public static MainWindow instance;
        SHZServer appServer;
        ServerConfig serverConfig;
        string ip = "127.0.0.1";
        int prort = 2017;
        public MainWindow()
        {
            InitializeComponent();
            instance = this;
        }
        /// <summary>
        /// 初始化服务器
        /// </summary>
        void Init()
        {
            appServer = new SHZServer();
            serverConfig = new ServerConfig
            {
                Port = prort,
                Ip = ip
            };
            if (!appServer.Setup(serverConfig))
            {
                InfoLbl.Content += "初始化失败!\r\n";
                return;
            }
            if (!appServer.Start())
            {
                InfoLbl.Content += "服务器启动失败!\r\n";
                return;
            }
            InfoLbl.Content += "启动服务器成功!\r\n";
        }
        /// <summary>
        /// 开启服务器
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Init();
        }
        /// <summary>
        /// 关闭服务器
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            appServer.Stop();
        }
        /// <summary>
        /// 向客户端发送消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            SHZSession.instance.SendMessage(txtBoxMsg.Text);
        }
    }
}
服务器消息的处理
[AppleScript] 纯文本查看 复制代码
using SuperSocket.SocketBase;
using SuperSocket.SocketBase.Protocol;
using System;

namespace WpfSuperSocket.SuperSocket
{
    public class SHZSession : AppSession<SHZSession>
    {
        public static SHZSession instance;
        /// <summary>  
        /// 新连接  
        /// </summary>  
        protected override void OnSessionStarted()
        {
            base.OnSessionStarted();
            instance = this;
        }

        /// <summary>  
        /// 捕捉异常并输出  
        /// </summary>  
        /// <param name="e"></param>  
        protected override void HandleException(Exception e)
        {
            this.Send("\r\n Exception: {0}", e.Message);
        }


        /// <summary>  
        /// 未知的Command  
        /// </summary>  
        /// <param name="requestInfo"></param>  
        protected override void HandleUnknownRequest(StringRequestInfo requestInfo)
        {
            base.HandleUnknownRequest(requestInfo);
            MainWindow.instance.Dispatcher.Invoke((Action)delegate () {
                MainWindow.instance.InfoLbl.Content += "\r\n" + "Marsha:" + requestInfo.Body + "\r\n";
            });
        }
        
        /// <summary>  
        /// 连接关闭  
        /// </summary>  
        /// <param name="reason"></param>  
        protected override void OnSessionClosed(CloseReason reason)
        {
            MainWindow.instance.Dispatcher.Invoke((Action)delegate () {
                MainWindow.instance.InfoLbl.Content += "\r\n" + reason .ToString()+ "\r\n";
            });
        }
        /// <summary>
        /// 向客户端发送消息
        /// </summary>
        /// <param name="msg"></param>
        public void SendMessage(string msg)
        {
            this.Send("Jack:"+msg);
            MainWindow.instance.Dispatcher.Invoke((Action)delegate () {
                MainWindow.instance.InfoLbl.Content += "\r\n" + "Jack:" + msg + "\r\n";
            });
        }
    }
}
对服务器操作时,执行的一些函数
[AppleScript] 纯文本查看 复制代码
using SuperSocket.SocketBase;
using System;

namespace WpfSuperSocket.SuperSocket
{
    class SHZServer:AppServer<SHZSession>
    {
        /// <summary>  
        /// 输出新连接信息  
        /// </summary>  
        /// <param name="session"></param>  
        protected override void OnNewSessionConnected(SHZSession session)
        {
            base.OnNewSessionConnected(session);
            MainWindow.instance.Dispatcher.Invoke((Action)delegate () {
                MainWindow.instance.InfoLbl.Content += "\r\n" + session.LocalEndPoint.Address.ToString() + ":连接\r\n";
            });
           
        }

        /// <summary>  
        /// 输出断开连接信息  
        /// </summary>  
        /// <param name="session"></param>  
        /// <param name="reason"></param>  
        protected override void OnSessionClosed(SHZSession session, CloseReason reason)
        {
            base.OnSessionClosed(session, reason);
            MainWindow.instance.Dispatcher.Invoke((Action)delegate () {
                MainWindow.instance.InfoLbl.Content += "\r\n" + session.LocalEndPoint.Address.ToString() + ":断开连接";
            });
        }
        /// <summary>
        /// 当服务器关闭时执行
        /// </summary>
        protected override void OnStopped()
        {
            base.OnStopped();
            MainWindow.instance.Dispatcher.Invoke((Action)delegate () {
                MainWindow.instance.InfoLbl.Content += "\r\n" + "服务器已停止"+ "\r\n";
            });
        }
    }
}

demo下载
游客,如果您要查看本帖隐藏内容请回复

使用SuperSocket框架实现简单的服务器和客户端网络通信 | 拾荒者 https://www.noobdev.cn/?p=608

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 2泰斗币 +51 热心值 +1 收起 理由
冷筱曦 + 1 + 1 赞一个!
洞悉 + 50 赞一个!

查看全部评分

+1
13502°C
36
  • 旅行的拾荒者
  • 旅行的拾荒者
  • 元元
  • frankwswswws
  • 低调的遗忘
过: 他们
因分享而快乐,学习以自强!
旅行的拾荒者
 楼主|
发表于 2017-3-27 16:30:59 显示全部楼层
使用SuperSocket需要引入两个动态库文件。动态库可以打开VS中的工具--NuGet包管理器--管理解决方案的NuGet程序包--在浏览中搜索SuperSocket。。下载SuperSocket和SuperSocket.Engine两个库。下载之后安装既可。
因分享而快乐,学习以自强!
旅行的拾荒者
 楼主|
发表于 2017-3-29 10:07:44 显示全部楼层
高性能的事件驱动通信;
非常简单易用; 你只需要通过创建几个类就能获得一个健壮的 Socket 服务器;
内置的命令行协议让你能够迅速创建一个网络命令行接口服务器;
强大且高性能的协议解析实现工具帮你简化了网络数据的分析工作;
灵活的配置功能和友好的配置 API;
多监听器支持; 让你在一个服务器实例内监听多个端口;
多服务器实例托管的支持让你从容面对复杂的部署需求;
应用程序域和进程级别的隔离能够满足你大部分的宿主场景;
内置的 SSL/TLS 加密支持;
会话级别的发送队列能够让你通过会话并发的发送数据,并保持高性能和可控性;
SuperSocket 的命令处理模式让你的业务逻辑更清晰,更有条理;
优良的可扩展 API 支持: Command Filter, Connection Filter, Command Loader;
可替换的日志架构允许你使用你喜欢的日志组件;
动态语言的支持; 允许你用 Python 之类的脚本语言来实现命令;
与 Mono/Linux 保持二进制级别的兼容;
Windows Azure 的支持;
内置你可以直接用于 Flash 或 Silverlight 客户端的 Socket 策略服务器;
因分享而快乐,学习以自强!
元元 发表于 2017-3-28 09:17:53 显示全部楼层
谢谢大神的分享
因分享而快乐,学习以自强!
frankwswswws 发表于 2017-3-28 18:00:27 显示全部楼层
谢谢分享,现在正好在用Socket做东西
因分享而快乐,学习以自强!
低调的遗忘 发表于 2017-3-29 11:15:02 显示全部楼层
学习一下。。。。。。
因分享而快乐,学习以自强!
梁旭东 发表于 2017-3-29 12:46:48 显示全部楼层
谢谢分享
因分享而快乐,学习以自强!
雪漏 发表于 2017-3-29 18:19:11 显示全部楼层
要前的吧,不要很贵
因分享而快乐,学习以自强!
旅行的拾荒者
 楼主|
发表于 2017-3-29 18:37:59 显示全部楼层
雪漏 发表于 2017-3-29 18:19
要前的吧,不要很贵

我专栏的帖子,如果有demo,都是回复免费下载{:6_152:}
因分享而快乐,学习以自强!
TAO_Y 发表于 2017-3-31 12:29:49 显示全部楼层
{:5_116:}!!!!!!!!!!!!!!
因分享而快乐,学习以自强!
开心丶 发表于 2017-3-31 13:01:41 显示全部楼层
强  感谢
因分享而快乐,学习以自强!
1071396508 发表于 2017-3-31 14:34:28 显示全部楼层
haohaohaohaohahoahoahao
因分享而快乐,学习以自强!
xxsstc 发表于 2017-3-31 16:14:07 显示全部楼层
支持一下!!!!!!!
因分享而快乐,学习以自强!
KUFFIOS 发表于 2017-4-1 09:05:47 显示全部楼层
感谢楼主分享!!!
因分享而快乐,学习以自强!
yunshenwuji66 发表于 2017-4-1 14:38:22 显示全部楼层
666666666666666
因分享而快乐,学习以自强!
123下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

VR/AR版块|Unity3d|Unreal4|新手报道|小黑屋|站点地图|沪ICP备14023207号-9|【泰斗社区】-专注互联网游戏和应用的开发者平台 ( 浙ICP 备 13006852号-15 )|网站地图

© 2001-2013 Comsenz Inc.  Powered by Discuz! X3.4

1
QQ