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中运行,而这个部署是基于热加载.当添加或修改某些应用的时候,是完全不会影响其他应用的正常工作.

 
分类: 类库分享

Glue4Net简单部署基于win服务的Socket程序的更多相关文章

  1. 基于Win服务的标签打印(模板套打)

    最近做了几个项目,都有在产品贴标的需求 基本就是有个证卡类打印机,然后把产品的信息打印在标签上. 然后通过机器人把标签贴到产品上面 标签信息包括文本,二维码,条形码之类的,要根据对应的数据生成二维码, ...

  2. 基于Windows服务的聊天程序(一)

    本文将演示怎么通过C#开发部署一个Windows服务,该服务提供各客户端的信息通讯,适用于局域网.采用TCP协议,单一服务器连接模式为一对多:多台服务器的情况下,当客户端连接数超过预设值时可自动进行负 ...

  3. 基于Windows服务的聊天程序

    本文将演示怎么通过C#开发部署一个Windows服务,该服务提供各客户端的信息通讯,适用于局域网.采用TCP协议,单一服务器连接模式为一对多:多台服务器的情况下,当客户端连接数超过预设值时可自动进行负 ...

  4. 最简单的基于FFMPEG的转码程序

    本文介绍一个简单的基于FFmpeg的转码器.它可以将一种视频格式(包括封转格式和编码格式)转换为另一种视频格式.转码器在视音频编解码处理的程序中,属于一个比较复杂的东西.因为它结合了视频的解码和编码. ...

  5. 模拟一个简单的基于tcp的远程关机程序(转)

    最近在学习unix网络编程,现在正在学习tcp的通信.其实,只要建立起了tcp通信,操作远端的计算机就不是什么问题了.正向telnet一样,也是基于tcp/IP协议的.所以这个实验,也算是对telne ...

  6. 最简单的基于FFMPEG的转码程序 —— 分析

    模块:  libavcodec    - 编码解码器         libavdevice   - 输入输出设备的支持         libavfilter   - 视音频滤镜支持         ...

  7. 最简单的基于FFmpeg的内存读写的例子:内存转码器

    ===================================================== 最简单的基于FFmpeg的内存读写的例子系列文章列表: 最简单的基于FFmpeg的内存读写的 ...

  8. 最简单的基于FFmpeg的内存读写的例子:内存播放器

    ===================================================== 最简单的基于FFmpeg的内存读写的例子系列文章列表: 最简单的基于FFmpeg的内存读写的 ...

  9. (转)最简单的基于FFmpeg的内存读写的例子:内存播放器

    ffmpeg内存播放解码 目录(?)[+] ===================================================== 最简单的基于FFmpeg的内存读写的例子系列文章 ...

随机推荐

  1. Swift学习——Swift解释特定的基础(七)

    Implicitly Unwrapped Optionals    隐式解析选项 如上所述.可选意味着常数或变量"没有值".通过可选if声明来推断是否存在值,假设有值析值. 有时候 ...

  2. Python challenge 3 - urllib &amp; re

    第三个主题地址:http://www.pythonchallenge.com/pc/def/ocr.html Hint1:recognize the characters. maybe they ar ...

  3. jquery扩展

    jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...

  4. crawler_UE使用技巧

    UE使用技巧 Tip 1: 如何去掉所编辑文本中包含特定字符串的行? 这则技巧是在UltraEdit的帮助文件里提到.CTRL+R 调出来替换(Replace)窗口,选中"使用正则表达式&q ...

  5. IOS SDK相机的详细解释/画廊(默认+他们的高清摄像头接口)

    原版的blog,转载请注明出处 blog.csdn.net/hello_hwc 前言: 新NSURLSession的UploadTask的,结果写那个Demo的时候想要写成拍照上传.然后就想到先写一个 ...

  6. 解决VS 于 致命错误 RC1015: 无法打开包含文件 &#39;afxres.h&#39; 问题

    在试验VS2010当一个问题困扰了我,它是开放的c++项目达产后,rc的dialog入口.您不能拖动控制,让我疯狂... 而最有发言权的是在线Directions问题. .题明显不是这个问题. 于是我 ...

  7. Swift语言指南(六)--可选值

    原文:Swift语言指南(六)--可选值 在值可能不存在的情况下使用可选值(optional), 可选值是: · 存在一个值,这个值等于 x 或 · 不存在任何值 注: 在 C 和 Objective ...

  8. 使用WebBrowser控件时在网页元素上绘制文本或其他自定义内容

    原文:使用WebBrowser控件时在网页元素上绘制文本或其他自定义内容 第一次在CNBlogs上发Post是提出一个有关使用WebBrowser控件时对SELECT网页元素操作的疑惑,这个问题至今也 ...

  9. 关于Cassandra与Thrift在int/text/varint上的暧昧

    近期简单写了一个基于Cassandra/C++的日志缓存,虽然是Nosql,但是在实际应用中,还是期望能有部分的临时CQL统计 或+-*/可以支持 所以在针对部分字段入库时,选择了作为整形录入,于是麻 ...

  10. 我的MYSQL学习心得(十二)

    原文:我的MYSQL学习心得(十二) 我的MYSQL学习心得(十二) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYS ...