Cet article présente principalement le résumé de la connexion simulée dans C# networkcomms 3.0. Les amis qui en ont besoin peuvent s'y référer
Les projets récents doivent être un clientRequêteSystème de statut, le système actuel. L'ordinateur hôte n'a pas de fonction de services, j'ai donc trouvé le framework open source networkcomms et je l'ai utilisé comme projet
La dernière version de l'adresse de téléchargement de networkcomms :https://github.com/MarcFletcher/NetworkComms.Net Télécharger directement vs ouvrir
Nouveau serveur
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"); } } } }
Voici l'erreur signalée
SendReceiveOptions aboveOptions = new SendReceiveOptions(DPSManager.GetDataSerializer<ProtobufSerializer>(), null, null);
Voici le client
Classe de contrat
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("ReqLogin", "ResLogin", 5000, contract); //向服务器发送登录信息并获取登录结果 // ResMsgContract resMsg = newTcpConnection.SendReceiveObject ("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; } } }
Conditions d'utilisation de ce framework Pour coopérer avec le protobuf de Google, vous devez choisir une bonne version. Je n'ai pas testé à nouveau la version la plus élevée car j'ai également modifié la version du protobuf lors du débogage d'autres problèmes survenus lors du processus de connexion jusqu'à présent. , Je n'ai pas testé si la version la plus élevée présentait des problèmes de compatibilité. Je l'ai testée avec succès. Celle utilisée est la 2.0.0.668
Introduction à protobuf protobuf est un framework de sérialisation open source fourni par Google. langages de représentation de données tels que XML et JSON. Sa plus grande caractéristique est qu'il est basé sur le binaire, il est donc meilleur que la représentation XML traditionnelle. Efficace et courtpar rapport à la méthode d'ajout de nuget
.
Entrée
Choisissez votre propre version Maintenant, augmentez la classe de contrat du projet. C'est ainsi que vous définissez le transfert. objectez-vous.
Résultat :
Ce qui précède est un résumé de l'implémentation de C# networkcomms 3.0 de la connexion simulée introduite par l'éditeur. J'espère que cela vous sera utile. Si vous avez des questions, laissez-moi un message et l'éditeur vous répondra à temps. Je voudrais également remercier tout le monde pour votre soutien au site Web de Script House !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!