Glue4Net简单部署基于win服务的Socket程序
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中运行,而这个部署是基于热加载.当添加或修改某些应用的时候,是完全不会影响其他应用的正常工作.
开源多台平通讯组件
个性化网站信息收录和订阅平台
c#组件设计交流群:47164588
c# socket :136485198 微博http://weibo.com/ikende
Glue4Net简单部署基于win服务的Socket程序的更多相关文章
- 基于Win服务的标签打印(模板套打)
最近做了几个项目,都有在产品贴标的需求 基本就是有个证卡类打印机,然后把产品的信息打印在标签上. 然后通过机器人把标签贴到产品上面 标签信息包括文本,二维码,条形码之类的,要根据对应的数据生成二维码, ...
- 基于Windows服务的聊天程序(一)
本文将演示怎么通过C#开发部署一个Windows服务,该服务提供各客户端的信息通讯,适用于局域网.采用TCP协议,单一服务器连接模式为一对多:多台服务器的情况下,当客户端连接数超过预设值时可自动进行负 ...
- 基于Windows服务的聊天程序
本文将演示怎么通过C#开发部署一个Windows服务,该服务提供各客户端的信息通讯,适用于局域网.采用TCP协议,单一服务器连接模式为一对多:多台服务器的情况下,当客户端连接数超过预设值时可自动进行负 ...
- 最简单的基于FFMPEG的转码程序
本文介绍一个简单的基于FFmpeg的转码器.它可以将一种视频格式(包括封转格式和编码格式)转换为另一种视频格式.转码器在视音频编解码处理的程序中,属于一个比较复杂的东西.因为它结合了视频的解码和编码. ...
- 模拟一个简单的基于tcp的远程关机程序(转)
最近在学习unix网络编程,现在正在学习tcp的通信.其实,只要建立起了tcp通信,操作远端的计算机就不是什么问题了.正向telnet一样,也是基于tcp/IP协议的.所以这个实验,也算是对telne ...
- 最简单的基于FFMPEG的转码程序 —— 分析
模块: libavcodec - 编码解码器 libavdevice - 输入输出设备的支持 libavfilter - 视音频滤镜支持 ...
- 最简单的基于FFmpeg的内存读写的例子:内存转码器
===================================================== 最简单的基于FFmpeg的内存读写的例子系列文章列表: 最简单的基于FFmpeg的内存读写的 ...
- 最简单的基于FFmpeg的内存读写的例子:内存播放器
===================================================== 最简单的基于FFmpeg的内存读写的例子系列文章列表: 最简单的基于FFmpeg的内存读写的 ...
- (转)最简单的基于FFmpeg的内存读写的例子:内存播放器
ffmpeg内存播放解码 目录(?)[+] ===================================================== 最简单的基于FFmpeg的内存读写的例子系列文章 ...
随机推荐
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 (2):数据 ...
- javascript实现数据结构:广义表
原文:javascript实现数据结构:广义表 广义表是线性表的推广.广泛用于人工智能的表处理语言Lisp,把广义表作为基本的数据结构. 广义表一般记作: LS = (a1, a2, ..., an ...
- 【高德地图API】从零开始学高德JS API(三)覆盖物——标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物
原文:[高德地图API]从零开始学高德JS API(三)覆盖物——标注|折线|多边形|信息窗口|聚合marker|麻点图|图片覆盖物 摘要:覆盖物,是一张地图的灵魂.有覆盖物的地图,才是完整的地图.在 ...
- printf与++的puzzle
int b = 0; int c = 0; int main(int argc, const char *argv[]) { printf("%d %d %d %d %d",b,b ...
- Winform中node.Text重命名时窗口无响应假死的解决方法
用户控件中有一个树,窗体使用了这个控件,但是重命名时执行node.text="XXXX" 执行了很长时间,大约9s,在此期间winform界面假死,尝试过多线程异步委托的方式来操作 ...
- Java之String类的使用细节
String类的特点: 字符串对象一旦被初始化就不会被改变,字符串存储在字符串常量池中(字符串缓冲区).如果池中没有就创建,如果有就直接拿过来用. 代码验证如下: String s ...
- ANDROID定义自己的观点——模仿瀑布布局(源代码)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简单介绍: 在自己定义view的时候,事实上非常easy,仅仅须要知道3步骤: 1.測量- ...
- SQL点滴10—使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比
原文:SQL点滴10-使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比 今天偶尔看到sql中也有with关键字,好歹也写了几年的sql语句,居然第一次接触,无知啊.看了一位博主的文章 ...
- JavaScript的基准测试
JavaScript的基准测试 原文:Bulletproof JavaScript benchmarks 做JavaScript的基准测试并没有想的那么简单.即使不考虑浏览器差异所带来的影响,也有很多 ...
- solr主从复制
solr主从复制 最近的开发工作涉及到两个模块“任务”和“日周报”.关系是日周报消费任务,因为用户在写日周报的时候,需要按一定的规则筛选当前用户的任务,作为日周报的一部分提交.整个项目采用类似于Orc ...