• Glue4Net简单部署基于win服务的Socket程序


    在写一些服务应用的时候经常把要它部署到windows service中,主要是让系统自动加载相关程序用于后台运行.正常写windows server需要单独写个程序包装和相应的安装类才能完成这些工作.但通过Glue4Net就可以非常简单地把代码或DLL部署到windows server中运行.下面地介绍通过Glue4Net简单地部署一个Socket程序.

    安装Glue4net

    首要工作是要把Glue4net安装下windows service中,下载http://www.ikende.com/files/file/Glue4net.rar 解压后运行install.bat 这样Glue4net就安装到windows server中.这个时候你要在服务中启动Glue4net,之后windows启动就会自动加载.

    实现一个Socket Tcp服务功能

    Glue4net可以挂DLL和代码文件,如果功能比较简单那直接写个.cs或.vb文件即可,下面就通过c#写一个简单的Socket Tcp服务.

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Net;
      5 using System.Net.Sockets;
      6 using System.Text;
      7 
      8 namespace Glue4Net.SocketServer
      9 {
     10     public class Server:Glue4Net.IAppModule
     11     {
     12         private Socket mListenSocket;
     13 
     14         private IList<Socket> mClients = new List<Socket>();
     15 
     16         private bool IsAccepting = false;
     17 
     18         private void BeginReceive(Socket e)
     19         {
     20             SocketAsyncEventArgs saea = new SocketAsyncEventArgs();
     21             saea.Completed += OnReceiveCompleted;
     22             saea.SetBuffer(new byte[1024], 0, 1024);
     23             saea.UserToken = e;
     24             if (!e.ReceiveAsync(saea))
     25             {
     26                 OnReceiveCompleted(this, saea);
     27             }
     28         }
     29 
     30         private void SendData(Socket e, byte[] data, int offset, int count)
     31         {
     32             e.Send(data, offset, count, SocketFlags.None);
     33         }
     34 
     35         private void OnReceiveCompleted(object sender, SocketAsyncEventArgs e)
     36         {
     37             if (e.SocketError == SocketError.Success && e.BytesTransferred > 0)
     38             {
     39                 SendData((Socket)e.UserToken, e.Buffer, 0, e.BytesTransferred);
     40                 BeginReceive((Socket)e.UserToken);
     41             }
     42             else
     43             {
     44                 mClients.Remove((Socket)e.UserToken);
     45                 Log.Error("{0} disposed!", e.RemoteEndPoint);
     46             }
     47             
     48         }
     49 
     50         private void OnAccept(object state)
     51         {
     52             while (IsAccepting)
     53             {
     54                 try
     55                 {
     56                     Socket socket = mListenSocket.Accept();
     57                     Log.Info("{0} connected!", socket.RemoteEndPoint);
     58                     mClients.Add(socket);
     59                     BeginReceive(socket);
     60                 }
     61                 catch (Exception e_)
     62                 {
     63                     Log.Info("Socket Server Accept error {0}",e_.Message);
     64                 }
     65             }
     66         }
     67 
     68         public void Load()
     69         {
     70             try
     71             {
     72                 mListenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     73                 mListenSocket.Bind(new IPEndPoint(IPAddress.Any, 10024));
     74                 mListenSocket.Listen(10);
     75                 IsAccepting = true;
     76                 System.Threading.ThreadPool.QueueUserWorkItem(OnAccept);
     77                 Log.Info("Socket Server Listen @{0}", 10024);
     78                 Log.Info("Load Socket Server Success!");
     79             }
     80             catch (Exception e_)
     81             {
     82                 Log.Error("Load Socket Server Error {0}", e_.Message);
     83             }
     84         }
     85 
     86         public IEventLog Log
     87         {
     88             get;
     89             set;
     90         }
     91 
     92         public string Name
     93         {
     94             get { return "Socket Server"; }
     95         }
     96 
     97         private void DisposedSocket(Socket e)
     98         {
     99             try
    100             {
    101                 
    102                 if (e != null)
    103                 {
    104                     mListenSocket.Close();
    105                     mListenSocket.Shutdown(SocketShutdown.Both);
    106                 }
    107             }
    108             catch
    109             {
    110             }
    111         }
    112 
    113         public void UnLoad()
    114         {
    115             try
    116             {
    117                 IsAccepting = false;
    118                 DisposedSocket(mListenSocket);
    119                 foreach (Socket client in mClients)
    120                 {
    121                     DisposedSocket(client);
    122                 }
    123                 Log.Info("Unload Socket Server Success!");
    124             }
    125             catch (Exception e_)
    126             {
    127                 Log.Error("Unload Socket Server Error {0}", e_.Message);
    128             }
    129         }
    130     }
    131 }

    继承Glue4Net.IAppModule是容器加载运行的规则,需要在Load方法中实现启动运行的工作,然后在UnLoad方法里实现服务关闭的工作.功能完成后把代码保存到任何目录下,这里是保存到H:SocketServer;以上是一个非常简单的Socket TCP服务,把接收的信息回应给发送端.

    部署Socket程序

    为了保证Glue4Net能加载,必须保让代码目录下存在Glue4Net.Dll这个文件,因为它是模块加载的入口点.把程序加载到Glue4Net是非常简单的事情,只需要在domains.config中添加一个配置即可.

    1 <add name="socketserver"
    2         compiler="true"
    3         path="H:SocketServer"
    4             updateWatch="true"
    5                watchFilter="*.cs|*.config"/>

    添加一个socketserver的应用名,然后目录指向之前存放代码的目录,确认配置信息无误后保存.当文件保后无须对Glue4Net进行重启服务即可加载完成.针对以上编写的代码部署完成后,你只需要telent 127.0.0.1 10024 即可连接到相应的服务中.

    总结

    通过Glue4Net非常简单就能把程序添加到windows service中运行,而这个部署是基于热加载.当添加或修改某些应用的时候,是完全不会影响其他应用的正常工作.

  • 相关阅读:
    wpf
    复联之程序员
    python批量重命名【截取文件名前六个字符 】
    xr报表调整
    jquery操作select取值赋值与设置选中[转]
    iframe 父页面与子页面之间的方法的相互调用【转】
    快速掌握Vue.js使用【转】
    解决非root用户使用docker的办法
    关于sentinel LDK加密war包实现应用加密的使用方法
    Windows安装Tomcat失败:Failed installing tomcat7 service
  • 原文地址:https://www.cnblogs.com/smark/p/3526592.html
Copyright © 2020-2023  润新知