zoukankan      html  css  js  c++  java
  • c# networkcomms 3.0实现模拟登陆总结

    最近项目需要做一个客户查询状态系统,当前上位机缺少服务功能,于是找到了networkcomms 开源框架,作为项目使用.

    最新版networkcomms 下载地址:https://github.com/MarcFletcher/NetworkComms.Net

    下载直接vs打开

    新建服务器端

    using MessageContract;
    using NetworkCommsDotNet;
    using NetworkCommsDotNet.Connections;
    using NetworkCommsDotNet.Connections.TCP;
    using NetworkCommsDotNet.DPSBase;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Windows.Forms;
    
    namespace AppServer
    {
        public partial class MaiForm : Form
        {
            public MaiForm()
            {
                InitializeComponent();
            }
            SendReceiveOptions aboveOptions = new SendReceiveOptions(DPSManager.GetDataSerializer<ProtobufSerializer>(), null, null);
            private void button1_Click(object sender, EventArgs e)
            {
                //服务器开始监听客户端的请求
                Connection.StartListening(ConnectionType.TCP, new IPEndPoint(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text)));
                //服务器开始监听客户端的请求           
                //IPEndPoint thePoint = new IPEndPoint(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text));
                //TCPConnection.StartListening(thePoint, false);
                button1.Text = "监听中";
                button1.Enabled = false;
                //button1.Text = "监听中";
                //button1.Enabled = false;
    
                //此方法中包含服务器具体的处理方法。
                StartListening();
            }
    
            private void StartListening()
            {
                //开启日志记录 
                //配置日志记录器
                //ILogger logger = new LiteLogger(LiteLogger.LogMode.ConsoleAndLogFile, "ServerLogFile_" + NetworkComms.NetworkIdentifier + ".txt");
                //NetworkComms.EnableLogging(logger);
    
                //禁用日志记录  服务器端正式使用时,赢禁用日志记录
                NetworkComms.DisableLogging();
    
    
                //服务器端处理收到的消息
                //为简单起见,此示例中我们只处理字符类型的信息,也返回字符类型的信息。
                //处理的信息可以使自定义类,具体见下一个Demo
                NetworkComms.AppendGlobalIncomingPacketHandler<LoginContract>("ReqLogin", IncomingLoginRequest);
    
            }
            //处理某个具体的请求
            private void IncomingLoginRequest(PacketHeader header, Connection connection, LoginContract loginContract)
            {
                try
                {
                    string resMsg = "";
    
                    //为了简单,这里不调用数据库,而是模拟一下登录
                    if (loginContract.UserID == "1000" && loginContract.PassWord == "123")
    
                        resMsg = "登录成功";
    
                    else
    
                        resMsg = "用户名密码错误";
                    //把返回结果写入到契约类中,后面返回给客户端
                    //ResMsgContract contract = new ResMsgContract();
                    //contract.Message = resMsg;
    
                    //connection.SendObject<ResMsgContract>("ResLogin", contract);
                    ResMsgContract contract = new ResMsgContract();
                    contract.Message = resMsg;
    
                    connection.SendObject("ResLogin", contract);
                }
                catch (Exception ex)
                {
                    // LogTools.LogException(ex, "IncomingMsgHandle");
                }
            }
        }
    }

    在别的帮助中往往少了这行:导致出现客户端发送时,类型打包出现问题. 这行代码是客户端服务器两端都要加上的,是指定传输方式

     SendReceiveOptions aboveOptions = new SendReceiveOptions(DPSManager.GetDataSerializer<ProtobufSerializer>(), null, null);

    就是这个报错了

    一下是客户端

    using MessageContract;
    using NetworkCommsDotNet;
    using NetworkCommsDotNet.Connections;
    using NetworkCommsDotNet.Connections.TCP;
    using NetworkCommsDotNet.DPSBase;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace AppClient
    {
        public partial class MainForm : Form
        {
            public MainForm()
            {
                InitializeComponent();
            }
            //连接信息对象
            public ConnectionInfo connInfo = null;
            //连接对象
            Connection newTcpConnection;
            SendReceiveOptions aboveOptions = new SendReceiveOptions(DPSManager.GetDataSerializer<ProtobufSerializer>(), null, null);
            private void button1_Click(object sender, EventArgs e)
            {
                //给连接信息对象赋值
                connInfo = new ConnectionInfo(txtIP.Text, int.Parse(txtPort.Text));
    
                //如果不成功,会弹出异常信息
                newTcpConnection = TCPConnection.GetConnection(connInfo);
    
                button1.Enabled = false;
                button1.Text = "连接成功";
            }
    
            private void btnlogin_Click(object sender, EventArgs e)
            {
                //给契约类赋值
                LoginContract contract = new LoginContract(txtUserName.Text, txtPassword.Text);
                //contract.UserID = txtUserName.Text;
                //contract.PassWord = txtPassword.Text;
                //向服务器发送登录信息并获取登录结果
                  ResMsgContract resMsg = newTcpConnection.SendReceiveObject<LoginContract, ResMsgContract>("ReqLogin", "ResLogin", 5000, contract);
                //向服务器发送登录信息并获取登录结果
               // ResMsgContract resMsg = newTcpConnection.SendReceiveObject<ResMsgContract>("ReqLogin", "ResLogin", 5000, contract);
    
                if (resMsg.Message == "登录成功")
                {
                    MessageBox.Show("登录成功");
    
                }
                else
                {
                    MessageBox.Show("用户名密码错误");
                }
            }
        }
    }

    契约类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace MessageContract
    {
        [ProtoContract]
        public class LoginContract
        {
            [ProtoMember(1)]
            public string UserID { get; set; }
    
            [ProtoMember(2)]
            public string PassWord { get; set; }
    
            public LoginContract() { }
    
            public LoginContract(string userID, string passWord)
            {
                this.UserID = userID;
                this.PassWord = passWord;
            }
        }
    }
    using ProtoBuf;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace MessageContract
    {
        [ProtoContract]
        public  class ResMsgContract
        {
            [ProtoMember(1)]
            public string Message;
            public ResMsgContract() { }
            public ResMsgContract(string message)
            {
                this.Message = message;
            }
        }
    }

    注意:

    使用这个框架要配合谷歌的protobuf   要选好版本.本人没重复测试最高版本,因为在调试登录过程中出现别的问题过程中,也顺改了protobuf 的版本,至今未测试最高版本是否存在兼容问题.本人成功的使用的是2.0.0.668

        protobuf简介protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小

    vs nuget添加方式

    输入

    版本选择自己指定一下,加大项目的契约类里边.这是自己定义传输对象的方式.

     结果:

  • 相关阅读:
    今天面试一些程序员(新,老)手的体会
    UVA 10635 Prince and Princess
    poj 2240 Arbitrage
    poj 2253 Frogger
    poj 2485 Highways
    UVA 11258 String Partition
    UVA 11151 Longest Palindrome
    poj 1125 Stockbroker Grapevine
    poj 1789 Truck History
    poj 3259 Wormholes
  • 原文地址:https://www.cnblogs.com/zuochanzi/p/7039636.html
Copyright © 2011-2022 走看看