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. leetcode 刷道题 70 earch Insert Position 二进制搜索插入位置

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  2. ServiceStack.Redis——Redis于.net向上client解

    ServiceStack.Redis--Redis于.net向上client解 源代码和使用: https://github.com/ServiceStack/ServiceStack.Redis 样 ...

  3. 华为OJ: 公共字符串计算

    有几个需要注意的地方,这个问题是不是大写和小写之间的区别.这样你就输入字符串大写或小写转换的计算前. 第二个,定要清晰.先将s1从[i]处開始与s2的[j]開始匹配,不相等则j++直到j等于s2.le ...

  4. asp.net 百度编辑器 UEditor 上传图片 图片上传配置 编辑器配置 网络连接错误,请检查配置后重试

    1.配置ueditor/editor_config.js文件,将 //图片上传配置区 ,imageUrl:URL+"net/imageUp.ashx" //图片上传提交地址 ,im ...

  5. javascript权威指南(2)

    JavaScript预定义了一系列全局变量和函数,在自定义变量和函数式要避免使用这些预定义的名称: arguments encodeURI  Infinity  Number  RegExp Arra ...

  6. 采用tcpdump攫Android网络数据包

    1 空灵的原理 tcpdump(需Root用户执行)拦截和显示发送或收到过网络连接到该机器的TCP/IP和其它数据包.简单说就监控手机进出网络数据. 2 方法优劣 2.1长处 1.手机数据包无遗漏 2 ...

  7. 清理收缩VMware虚拟机MacOS系统的vmdk文件大小

    屌丝行和差的主要标准,尽管持续性眼贪婪mbp.但是,从另一方面限制患有米,只是在虚拟机中播放MacOS.(我不会告诉你我的笔记本i5+120SSD+500HHD+12G内存,跑MacOS虚拟机一点不卡 ...

  8. 6.跑步者--并行编程框架 ForkJoin

    本文如果您已经了解一般并行编程知识.了解Java concurrent部分如ExecutorService等相关内容. 虽说是Java的ForkJoin并行框架.但不要太在意Java,当中的思想在其他 ...

  9. Python学习笔记16:标准库多线程(threading包裹)

    Python主要是通过标准库threading包来实现多线程. 今天,互联网时代,所有的server您将收到大量请求. server要利用多线程的方式的优势来处理这些请求,为了改善网络port读写效率 ...

  10. 《python源代码剖析》笔记 python虚拟机中的函数机制

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.Python虚拟机在运行函数调用时会动态地创建新的 PyFrameObject对象, 这 ...