一个有用的Windows服务小程序——用来完成Server端的Socket通信

原创 2007年10月13日 08:35:00
       今天被迫要做一个接收通信的模块,以前从来都没有做过关于通信方面的东西,就像没有做过有关GIS方面的程序一样是头一次开发此类程序。
      这个Socket通信说是自己的其实完全不是(如果哪位高人见到此程序是您本人开发的千万不要介意,本人也是在网上搜索出的,这个程序真的很不错,值得推广哦!在此谢谢发布此Socket通信程序的高人)。
      此程序的大部分源码没有任何改动,只是原来的Server端是用C/S程序写的,为了能使Socket通信的Server端更灵活,在此将其改成一个Windows服务,因此也需要改动了一些Server端的代码和工程,但是基础类和Client端都没有改变。
      对于我本人来说,Windows服务和Socket通信本人都不是很了解,只是经过了昨天简单的学习和研究才完成了此Windows服务Server端Socket通信程序,所以也说不出太多的门道,如果有清楚这方面知识的博友还希望能多多交流。好了,废话少说,开始正题了。
      现在开始我们来讲解,如何一步一步地完成Windows服务Server端Socket通信程序。
      我个人认为Windows服务只是包裹在Socket通信程序外的“一件外套”,所以核心还是我在网上找到的这个Socket程序,为此我们的第一步应该先开发出此Socket程序的类库。
1、打开Visual Studio.Net2003,单击菜单中的“文件”——>“新建”——>“项目”,在弹出的对话框左侧选择“Visual C#项目”,在右侧选择“类库”,下方的名称中输入“SocketLibrary”,位置自己随便选择一个路径。
2、删除自动创建的Class1.cs,新建如下的类名文件“Client.cs”、“Connection.cs”、“ConnectionCollection.cs”、“Message.cs”、“MessageCollection.cs”、“Server.cs”、“SocketBase.cs”和“SocketFactory.cs”。
3、各个类文件的代码如下:
(1)、Client.cs文件中的代码:
Client.cs文件代码
(2)、Connection.cs文件中的代码:
Connection.cs文件代码
(3)、ConnectionCollection.cs文件中的代码:
ConnectionCollection.cs文件代码
(4)、Message.cs文件中的代码:
Message.cs文件代码
(5)、MessageCollection.cs文件中的代码:
MessageCollection.cs文件代码
(6)、Server.cs文件中的代码:
Server.cs文件代码
(7)、SocketBase.cs文件中的代码:
SocketBase.cs文件代码
(8)、SocketFactory.cs文件中的代码:
SocketFactory.cs文件代码
4、将文件和代码建立和粘贴完成后,运行此类库,会在程序所在路径文件夹里的“bin/Debug/”下找到“SocketLibrary.dll”文件,下面开发的Windows服务就需要引用这个dll文件。

      第二步再来开发出Windows服务。
1、打开Visual Studio.Net2003,单击菜单中的“文件”——>“新建”——>“项目”,在弹出的对话框左侧选择“Visual C#项目”,在右侧选择“Windows服务”,下方的名称中输入“SocketService”,位置自己随便选择一个路径。
2、删除自动创建的服务文件,新建如下的Windows服务文件“SocketService.cs”。
3、在SocketService.cs文件的设计界面,选择开发环境右侧的“属性”页卡,会在页卡底部发现“添加安装程序(I)”,单击此处后会在解决方案的SocketService工程下多一个服务文件“ProjectInstaller.cs”。
4、在ProjectInstaller.cs文件的设计界面,会看见两个组件“serviceProcessInstaller1”和“serviceInstaller1”。将serviceProcessInstaller1组件的Account属性设置为“LocalSystem”(表示本地系统服务,NetworkService表示网络服务,LocalService表示本地服务,User表示用户服务);再将serviceInstaller1组件的StartType属性设置为“Automatic”(表示服务自动启动,Manual表示手动启动,Disabled表示禁用)。
5、右击解决方案中的“引用”,选择添加引用,在弹出的对话框中选择“浏览”,将前面的“SocketLibrary.dll”添加到此引用。
6、在系统C盘下建立两个文件“SocketService.ini”和“SocketService.log”。SocketService.ini文件是配置SocketService监听的端口号,打开该ini文件在其中编辑下面的内容“端口号:8088”(双引号请不要输入在ini文件的内容里),而SocketService.log是为了记录有关信息的日志。
7、删除SocketService.cs文件的所有代码,将下面的代码拷贝到该文件中:
SocketService.cs文件代码
8、在Visual Studio.Net2003的菜单上选择“生成”——>“重新生成解决方案”,当生成成功后,会在程序所在路径文件夹里的“bin/Debug/”下找到“SocketService.exe”文件,记住这个路径和文件名,下一步需要用到。
9、打开“Visual Studio .NET 2003 命令提示”(应该都知道如何打开吧,不知道的可以在评论中询问)。在其中输入“installutil [第8步中的路径和文件名]”(例如:installutil C:/SocketService/bin/Debug/SocketService.exe),按下回车,将会在本机上安装刚开发好的Windows服务,如果要卸载安装过的Windows服务请在“Visual Studio .NET 2003 命令提示”中输入“installutil /u [第8步中的路径和文件名]”(例如:installutil /u C:/SocketService/bin/Debug/SocketService.exe)。
10、制作Windows服务的安装部署工程(略)。

      第三步最后开发出一个Socket通信的客户端来验证此服务。
1、和以往建立C/S程序的过程一样,只是将工程名称改为“SocketClientTest”。
2、删除自动创建的Form1,新建窗体“CFrom”。
3、窗体控件与布局见下图:

4、在引用中添加“SocketLibrary.dll”引用(添加方法和SocketService工程添加方法相同)
5、后台代码如下:
CForm.cs文件代码

6、运行程序,点击CForm中的“连接”按钮,再在TextBox1中输入部分信息,单击“发送”按钮,看看在C:/SocketService.log中是否记录了CForm窗口中TextBox1中的内容。

      到此我们就已经将这个Socket通信Server端的Winodows服务开发完成了。下面提供源程序的下载:

本地下载    SocketLibrary类库源码

本地下载    Server端Socket通信Windows服务源码

本地下载    SocketClientTest源码

本地下载    SocketServerTest源码(没有改变为Windows服务时的程序,即下载时的原程序)

以上程序已在在Visual Studio.Net2003下运行通过。

最近发现,此Socket程序的一个问题,就是此Socket程序用自己的Socket的Client端测试没有问题,但是用其他的普通Socket就会出现收不到消息包,但是连接是被建立的。主要问题出现在Message.cs文件中,为此更改了此文件的部分代码,以便能够在客户端和服务端接收通用的Socket消息包。
更改Message.cs文件中的代码如下:
更改Message.cs文件中的代码

约束Socket消息包的消息体内容不能超过1024字节。

经过实际应用发现此Socket程序存在的问题还真不少,就是改为我前一个更正评论后也仍然有问题存在,虽然可以收到通用的Socket消息包了,但是程序在长时间接收大量客户端发来的消息后,会出现只有连接成功,而不再接收连接后的消息包,分析其原因,主要错误的设计如下两个地方:
1、采用两个线程。一个线程是用来连接客户机并取得消息流内容放入自己定义的NetworkStream流中;另一个则是从NetworkStream流中读取消息体。
2、使用了自定义的NetworkStream流,而这个流却被用在两个不同的线程中,每个线程的休眠时间为200ms。
现在我们分析出了错误的地方,那么就需要找到解决方法,我们现在将判断连接和读取NetworkStream流都放在一个线程里完成,而不要分为两个线程。
需要更改的文件有SocketBase.cs、Server.cs和Client.cs。
更改SocketBase.cs文件中的代码如下:
更改SocketBase.cs文件中的代码
 
更改Server.cs文件中的代码如下:
更改Server.cs文件中的代码

更改Client.cs文件中的代码如下:
更改Client.cs文件中的代码

作品说明:

作者:刚刚

最初本人发表本作品网址:http://www.cnblogs.com/lijigang/archive/2007/05/22/754976.html

 

郑重声明:

最近“刚刚”本人发现网络中有个别人将此文章当作原创发布在了自己在CSDN等网站上的博客里,现特别说明本文的原创地址与作者为上述“作品说明”,其他网站或个人博客中的原创标识都不足以相信为真的原创含义。请尊重网络作品转载等方式方法的著作版权!

Windows服务完成Server端的Socket通信

现在开始我们来讲解,如何一步一步地完成Windows服务Server端Socket通信程序。       我个人认为Windows服务只是包裹在Socket通信程序外的“一件外套”,所以核心还是我在...
  • jjkliu
  • jjkliu
  • 2014年07月15日 16:42
  • 544

串口与socket通信

Win32重叠I/O(Overloapped I/O)机制允许发起一个操作,然后在操作完成之后接受 到信息。对于那种需要很长时间才能完成的操作来说,重叠I/O机制尤其有用,因为发起 重叠操作的线程...
  • neubuffer
  • neubuffer
  • 2013年11月23日 14:18
  • 1807

windows Socket编程之完成端口模型

上篇介绍了重叠IO模型,它已经把我们的等待数据到来和拷贝数据到我们程序的缓冲区这个时间全部交给了操作系统去完成了,它已经很完善了。但是,如果我们想要把服务端的性能做的更好一点的话,它还是有点不足的,比...
  • Timmiy
  • Timmiy
  • 2016年08月17日 15:09
  • 1198

【windows socket+UDP服务器客户端】

Windows Socket+TCP服务器客户端      Winsock是 Windows下套接字标准。          1.UDP socket编程:          UDP(用户数据报协议)...
  • Jiangweihll
  • Jiangweihll
  • 2014年05月09日 17:48
  • 7010

web请求和socket通信

详谈socket请求Web服务器过程 最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的...
  • liu_qiqi
  • liu_qiqi
  • 2015年05月16日 10:15
  • 4216

Windows Socket 编程_ 简单的服务器/客户端程序

一、Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换。 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地...
  • lbaihao
  • lbaihao
  • 2017年06月23日 18:01
  • 235

小练习:用socket实现Linux和Windows之间的通信

结合了网上一些经典例程,写了一个简单的socket代码,实现Ubuntu(虚拟机中)和Windows的通信。...
  • liyuefeilong
  • liyuefeilong
  • 2015年08月04日 00:07
  • 3940

socket通信之九:使用完成端口实现的一个聊天室

基本上windows平台下的几种IO模型都实现了一遍,还有两个没有实现,但是它们一个需要基于windows消息,一个和重叠IO中的事件通知模型比较类似,并且不能实现真正的异步,所以就不列出来了。 ...
  • u012501459
  • u012501459
  • 2015年09月04日 23:08
  • 2427

linux下socket通信,server和client简单例子

server.c ==================================================================== #include // for...
  • xiaojun111111
  • xiaojun111111
  • 2016年09月26日 09:58
  • 957

windows下实现socket通信

原本以为c是跨平台,所以,c在windows下和linux下的程序应该是类似于Java,什么都不用改变的,今儿才恍然大悟,他们的类库不一样啊…… 下面我贴出来一个windows下的c语言socket通...
  • u013485792
  • u013485792
  • 2016年03月30日 15:11
  • 989
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个有用的Windows服务小程序——用来完成Server端的Socket通信
举报原因:
原因补充:

(最多只允许输入30个字)