好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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

最新版networkcomms 下载地址:https://github测试数据/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测试数据ponentmodel;

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测试数据ponentmodel;

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# networkcomms 3.0实现模拟登陆总结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:http://HdhCmsTestcnblogs测试数据/zuochanzi/archive/2017/06/17/7039636.html

dy("nrwz");

查看更多关于C# networkcomms 3.0实现模拟登陆总结的详细内容...

  阅读:48次