皮皮网
皮皮网
必胜股票源码

【开放软件源码】【sequencefile 源码】【源码加速】ws平台源码

时间:2024-11-30 14:53:29 分类:焦点 编辑:伪装邮件源码
1.【nodejs】全网首发教程 从零写一个websocket服务器 无任何框架
2.我把程序修改了 不知道怎样在ws程序下重读脚本

ws平台源码

【nodejs】全网首发教程 从零写一个websocket服务器 无任何框架

       nodejs从零搭建websocket服务器教程

       这篇文章提供了一个无框架的平台全网首发教程,作者自信地表示,源码其行的平台源码已经具备了基础websocket服务器功能,且在便利性、源码性能和自定义性上优于主流框架。平台通过npm直接安装`npm i iiws`,源码开放软件源码只需注意修改package.json的平台main字段。源码链接:/Bylx/iiws,源码注释为英文。平台

       理解websocket与http的源码不同至关重要。websocket通信基于二进制帧,平台每帧都有特定的源码格式,包括fin(消息结束标志)、平台opcode(操作码)、源码payload length(内容长度)和mask(掩码)。平台帧的处理涉及二进制知识,比如1 byte等于8 bits,payload length小于时用7位表示,大于时则需特殊处理。sequencefile 源码

       教程详细介绍了如何通过造小轮子(自定义实现)来构建websocket服务器,涉及接入原生API、创建和解析帧、以及使用mask进行数据处理。作者分享了从理论到实践的完整步骤,即使是nodejs初学者也能从中学习到websocket通信的核心原理和数据处理思路。

       作者强调,尽管代码量少,但包含了他的源码加速大量学习和理解,这让他感到满足。不论你是nodejs开发者还是对websocket感兴趣,这篇教程都会对你的学习有所帮助。如有任何疑问,欢迎在评论区提问。

我把程序修改了 不知道怎样在ws程序下重读脚本

       首先,动态编译实际上只涉及到两个类型:CodeDomProvider以及CompilerParameters他们都位于System.CodeDom.Compiler命名空间。

          

       以下代码可将源码动态编译为一个程序集:

       动态编译

       获得assembly后,随后我们即可以通过反射获取程序集里面的seckill源码类型,然后实例化,调用类型方法

       不过在此之前,我们得构造WS服务的代理类,使用WCF框架,创建服务代理类,常见的代理类结构如下:

       所以,我们要动态构造出代理类源码,应该知道服务的命名空间、服务方法的yeyou源码Action地址、ReplyAction地址,当然还有服务方法的名称,返回类型,参数列表。这里,我们省略掉服务方法的参数列表,构造代理类,实际上就是一个字符串组装的问题,先创建一个类型,用于保存构造代理类所要用到的参数:

       服务代理类构造参数

       public class WebServiceParamaters

       {

           public string address;

           public string Address

           {

               get { return address; }

               set

               {

                   address = value;

               }

           }

           private string serviceNamespace;

           public string ServiceNamespace

           {

               get { return serviceNamespace; }

               set

               {

                   serviceNamespace = value;

               }

           }

          private string methodAction;

           public string MethodAction

           {

               get { return methodAction; }

               set

               {

                   methodAction = value;

               }

           }

           private string methodReplyAction;

           public string MethodReplyAction

           {

               get { return methodReplyAction; }

               set

               {

                   methodReplyAction = value;

               }

           }

           private string methodName;

           public string MethodName

           {

               get { return methodName; }

               set

               {

                   methodName = value;

               }

           }

           private string returnType;

           public string ReturnType

           {

               get { return returnType; }

               set

               {

                   returnType = value;

               }

           }

       }

        好,现在我们只需要构造出代理类源码,然后动态编译出代理类的程序集,最后通过反射调用服务方法:

       WebServiceProxyCreator

       public class WebServiceProxyCreator

       {

           public Object WebServiceCaller(WebServiceParamaters parameters)

           {

               CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

               CompilerParameters codeParameters = new CompilerParameters();

               codeParameters.GenerateExecutable = false; 

               codeParameters.GenerateInMemory = true; 

               StringBuilder code = new StringBuilder();

               CreateProxyCode(code, parameters);

       codeParameters.ReferencedAssemblies.Add("System.dll"); 

       codeParameters.ReferencedAssemblies.Add("System.ServiceModel.dll"); 

               CompilerResults results = provider.CompileAssemblyFromSource(codeParameters, code.ToString());

               Assembly assembly = null; 

               if (!results.Errors.HasErrors)

               {

                   assembly = results.CompiledAssembly;

               }

               Type clientType = assembly.GetType("RuntimeServiceClient");

              ConstructorInfo ci = clientType.GetConstructor(new Type[] { typeof(Binding), typeof(EndpointAddress) });

               BasicHttpBinding binding = new BasicHttpBinding(); //只演示传统的WebService调用

               EndpointAddress address = new EndpointAddress(parameters.address);

               Object client = ci.Invoke(new object[] { binding, address });

               MethodInfo mi = clientType.GetMethod(parameters.MethodName);

               Object result = mi.Invoke(client, null);

               mi = clientType.GetMethod("Close"); //关闭代理

               mi.Invoke(client, null);

               return result;

          }

           public static void CreateProxyCode(StringBuilder code, WebServiceParamaters parameters)

           {

               code.AppendLine("using System;");

               code.AppendLine("using System.ServiceModel;");

               code.AppendLine("using System.ServiceModel.Channels;");

               code.Append(@"[ServiceContract(");

               if (!String.IsNullOrEmpty(parameters.ServiceNamespace))

               {

                   code.Append("Namespace=\"").Append(parameters.ServiceNamespace).Append("\"");

               }

               code.AppendLine(")]");

               code.AppendLine("public interface IRuntimeService");

               code.AppendLine("{ ");

               code.Append("[OperationContract(");

               if (!String.IsNullOrEmpty(parameters.MethodAction))

               {

                   code.Append("Action=\"").Append(parameters.MethodAction).Append("\"");

                   if (!String.IsNullOrEmpty(parameters.MethodReplyAction))

                   {

                       code.Append(", ");

                   }

               }

               if (!String.IsNullOrEmpty(parameters.MethodReplyAction))

               {

                   code.Append("ReplyAction=\"").Append(parameters.MethodReplyAction).Append("\"");

               }

               code.AppendLine(")]");

               code.Append(parameters.ReturnType).Append(" ");

               code.Append(parameters.MethodName).AppendLine("();");

               code.AppendLine("}");

               code.AppendLine();

               code.AppendLine("public class RuntimeServiceClient : ClientBase<IRuntimeService>, IRuntimeService");

               code.AppendLine("{ ");

               code.AppendLine("public RuntimeServiceClient(Binding binding, EndpointAddress address) :base(binding, address)");

               code.AppendLine("{ ");

               code.AppendLine("}");

               code.Append("public ").Append(parameters.ReturnType).Append(" ");

               code.Append(parameters.MethodName).AppendLine("()");

               code.AppendLine("{ ");

               code.Append("return base.Channel.").Append(parameters.MethodName).AppendLine("();");

               code.AppendLine("}");

               code.AppendLine("}");

           }

       }

       注意,由于代理类使用了WCF框架,所以编译时我们需要添加System.ServiceModel的引用,当然System.dll肯定是必须的,这里要注意,System.ServiceModel.dll应该保存到应用程序目录,否则动态编译时会引发异常,很简单,在工程引用中添加System.ServiceModel的引用,然后在属性中将拷贝到本地属性设置为true。

         

       到此,我们就可以直接通过传入的服务地址、服务方法名称以及相关的命名空间,即可调用服务(尽管我们只能调用无参服务,并且尽管我们也只能调用使用BasicHttpBinding绑定的服务,这些限制的原因是…我懒,好吧,相信只要经过一点改动即可去掉这些限制)。

         

       可惜,我们的程序还很傻:每次调用服务都需要去生成代码、编译、创建代理实例最后再调用,嗯…那就缓存吧:

        

       在WebServiceParameters类中重写GetHashCode方法:

       然后在WebServiceProxyCreator中加入缓存机制:

         public class WebServiceProxyCreator

          {

              private static Dictionary<int, Type> proxyTypeCatch = new Dictionary<int, Type>();

              public Object WebServiceCaller(WebServiceParamaters parameters)

              {

                  int key = parameters.GetHashCode();

                  Type clientType = null;

                  if (proxyTypeCatch.ContainsKey(key))

                 {

                     clientType = proxyTypeCatch[key];

                     Debug.WriteLine("使用缓存");

                 }

                 else

                 {

                     CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

                     CompilerParameters codeParameters = new CompilerParameters();

                     codeParameters.GenerateExecutable = false;

                     codeParameters.GenerateInMemory = true;

                     StringBuilder code = new StringBuilder();

                     CreateProxyCode(code, parameters);

                     codeParameters.ReferencedAssemblies.Add("System.dll");

                     codeParameters.ReferencedAssemblies.Add("System.ServiceModel.dll");

                     CompilerResults results = provider.CompileAssemblyFromSource(codeParameters, code.ToString());

                     Assembly assembly = null;

                     if (!results.Errors.HasErrors)

                     {

                         assembly = results.CompiledAssembly;

                     }

                     clientType = assembly.GetType("RuntimeServiceClient");

                     proxyTypeCatch.Add(key, clientType);

                 }

                 ConstructorInfo ci = clientType.GetConstructor(new Type[] { typeof(Binding), typeof(EndpointAddress) });

                 BasicHttpBinding binding = new BasicHttpBinding(); //只演示传统的WebService调用

                 EndpointAddress address = new EndpointAddress(parameters.address);

                 Object client = ci.Invoke(new object[] { binding, address });

                 MethodInfo mi = clientType.GetMethod(parameters.MethodName);

                 Object result = mi.Invoke(client, null);

                 mi = clientType.GetMethod("Close"); //关闭代理

                 mi.Invoke(client, null);

                 return result;

             }

        }

本文地址:http://0553.net.cn/news/09a610493886.html

关注焦点

热点资讯

copyright © 2016 powered by 皮皮网   sitemap