三沣开发知识 购物 网址 小说 美女秀 游戏 电影下载 图说天下 生肖星座 新闻 笑话 | IT开发 软件下载 手机论坛 三沣软件 360图书馆
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题
autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml
html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> C# -> c# networkcomms 3.0实现模拟登陆总结 -> 正文阅读
 

[C#]c# networkcomms 3.0实现模拟登陆总结

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添加方式

输入

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

 结果:

  C# 最新文章
使用mongodb作为Quartz.Net下的JobStore实现
Log4Net记录到MySql
C# BackgroundWorker 的使用
C#定时发送邮箱设置
C# FTP操作类
C# 视频转换类
04.C#类型系统、值类型和引用类型(二章2.2
C#常用的IO操作方法
8、C#基础整理(数组和冒泡排序)
csharp: SQL Server 2005 Database Backup
上一篇文章           查看所有文章
加:2017-06-18 01:44:00  更:2017-06-18 01:44:02 
 
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 母婴/育儿 软件开发资料 网页快照 文字转语音 购物精选 软件 美食菜谱 新闻中心 电影下载 小游戏 Chinese Culture
生肖星座解梦 三沣玩客 拍拍 视频 开发 Android开发 站长 古典小说 网文精选 搜图网 天下美图 中国文化英文 多播视频
2017-6-29 11:45:11
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库