c# networkcomms 3.0實現模擬登陸總結

来源:http://www.cnblogs.com/zuochanzi/archive/2017/06/17/7039636.html
-Advertisement-
Play Games

最近項目需要做一個客戶查詢狀態系統,當前上位機缺少服務功能,於是找到了networkcomms 開源框架,作為項目使用. 最新版networkcomms 下載地址:https://github.com/MarcFletcher/NetworkComms.Net 下載直接vs打開 新建伺服器端 在別的 ...


最近項目需要做一個客戶查詢狀態系統,當前上位機缺少服務功能,於是找到了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添加方式

輸入

版本選擇自己指定一下,加大項目的契約類裡邊.這是自己定義傳輸對象的方式.

 

 結果:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄 "簡介" "常用命令" "功能" "代理" "反向代理" "集群" HTTP集群 TCP集群 "重定向" "靜態文件" "HTTPS配置" "常見問題" 簡介 Nginx ("engine x") 是一款輕量級,高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。 傳 ...
  • 擴容兩步走: 第一步捲擴容 第二步文件系統擴容 需要註意的是不同Linux發行版本,文件格式有所不同 xfs用 ext3用 是時候給蒼老師安排換個新房子 :) ...
  • 1. 文件描述符(重點) 在Linux系統中一切皆可以看成是文件,文件又可分為:普通文件、目錄文件、鏈接文件和設備文件。文件描述符(file descriptor)是內核為了高效管理已被打開的文件所創建的索引,其是一個非負整數(通常是小整數),用於指代被打開的文件,所有執行I/O操作的系統調用都通過 ...
  • 最近在將項目從.net 遷移到.net core環境中,遷移完成後,發佈於Windows平臺上進行測試,所有功能均能正常運行。 為了項目能夠在正式環境也能正常運行,提前進行Linux環境部署(Centos7)預發佈,就在預發佈後進行代碼的基本測試後, 發現日誌中出現了string轉datetime錯 ...
  • await 關鍵字不會創建新的線程,而是由Task任務或是FCL中的xxxAsync等方法創建的線程,而且這裡創建的線程都是基於線程池創建的工作線程,屬於後臺線程。 await關鍵字會阻塞/暫停調用它的方法,也即下麵的 Phycology 方法.當阻塞其調用方法的時候,程式會回到UI線程中去執行,也 ...
  • 才疏學淺,勤奮一點。——無感 關於Socket技術的細緻講解,博客園中已經有不少文章可以學習。我這主要是就自己在開發過程中做的一個數據對接程式設計的總結。 首先,定義介面。 1:IStructData 數據結構介面 包含兩個方法,一個是設置校驗位元組,一個是校驗方法。 1 interface IStr ...
  • supervisor 介紹: 這是一款用python編寫的進程管理工具,可以守護他管理的所有進程,防止異常退出,以及提供一個可視化的web界面來手動管理,打開關閉重啟各種應用,界面如下: 關於在centos上安裝supervisor: 1、通過yum安裝: 2、配置supervisor: 我們去用v ...
  • Asp.net core 以及MVC4.6中如何全局對用戶輸入做Trim空白處理?本文實例分享 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...