使用SuperSocket框架实现简单的服务器和客户端网络通信【一】

        SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架。你无须了解如何使用 Socket, 如何维护 Socket 连接和 Socket 如何工作,但是你却可以使用 SuperSocket 很容易的开发出一款 Socket 服务器端软件,例如游戏服务器,GPS 服务器, 工业控制服务和数据采集服务器等等。

        其他的就不介绍了,代码里面全部都有注释。

        看代码就行了,代码很少。服务器端Demo是使用WPF做的(VS2017),客户端没有,测试代码可以使用Telnet(开启方式–程序和功能–启用或关闭Windows功能–找到Telnet客户端勾选上–点击确定)。Telnet使用方法–Win+R–输入CMD–命令台输入telnet localhost 2017

注:2017是端口号

        使用SuperSocket需要引入两个动态库文件。动态库可以打开VS中的工具–NuGet包管理器–管理解决方案的NuGet程序包–在浏览中搜索SuperSocket。。下载SuperSocket和SuperSocket.Engine两个库。下载之后安装既可。

服务器的初始化

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);
        }
    }
}

服务器消息的处理

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";
            });
        }
    }
}

对服务器操作时,执行的一些函数

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下载

链接:http://pan.baidu.com/s/1bpKjOr9 密码:d2vf

http://www.noobdev.cn/?p=608 

猜你喜欢

转载自blog.csdn.net/ba_wang_mao/article/details/114881450