WINDOWS服务自动启动的,是指操作系统打开时自动启动的应用程序,必须在注册表里进行配置是启动、手动、禁止。
它的体制有:服务程序的功能、服务控制程序和服务配置程序。服务程序功能本身用于我们想要解决的实际问题;服务控制程序可以把控制请求发给服务,比如开始、停止等;服务配置用于安装服务。
使用网络接口的类:TcpListener
using System;
using System.IO;
using System.Threading;
using System.Collections.Specialized;
using System.Net.Sockets;
using System.Text;
using System.Net;

namespace QuoteServer
{
/// <summary>
/// 从文件中随机读取一行数据,并把它发送给客户端
/// </summary>
public class QuoteServer
{
//Tcp监听
private TcpListener listener;
private int port; //端口
private string filename;
private StringCollection quotes; //字符串集合
private Random random; //随机数
private Thread ListenThread;//监听线程


构造函数


/// <summary>
/// 读取文件的
/// </summary>
public void readQuotes()
{
quotes=new StringCollection();
//读取文件
Stream st=File.OpenRead(filename);
StreamReader sr=new StreamReader(st);

string quote;
while((quote=sr.ReadLine())!=null)
{
quotes.Add(quote);
}

sr.Close();
st.Close();
random=new Random();

}

/// <summary>
/// 得到随机索引
/// </summary>
/// <returns></returns>
protected string getRandomQuoteOfTheDay()
{
int index=random.Next(quotes.Count);
return quotes[index];
}

/// <summary>
/// 启动方法
/// </summary>
public void Start()
{
readQuotes();
ListenThread=new Thread(new ThreadStart(this.Listener));
ListenThread.Start();

}

/// <summary>
/// 进行监听,得到客户的连接,把随机的内容发送给客户
/// </summary>
public void Listener()
{
listener=new TcpListener(port);
listener.Start();
while(true)
{
//等待连接
Socket socket=listener.AcceptSocket();

if(socket==null)
{
return;
}

//把信息发送给客户端
string message=getRandomQuoteOfTheDay();

UnicodeEncoding ue=new UnicodeEncoding();

byte[] buffer=ue.GetBytes(message);

socket.Send(buffer,buffer.Length,0);

socket.Close();
}
}

/// <summary>
/// 关闭监听器
/// </summary>
public void Stop()
{
listener.Stop();
}

/// <summary>
/// 挂起线程
/// </summary>
public void Suspend()
{
ListenThread.Suspend();
}

/// <summary>
/// 重新激活线程
/// </summary>
public void Resume()
{
ListenThread.Resume();
}

/// <summary>
/// 重新得到内容
/// </summary>
public void reflush()
{
readQuotes();
}
}
}
二、安装服务(在VS中新建WINDOWS服务),并添加服务功能的装配件,修改该服务的属性:为ServiceName ,
它为创建服务的名称。并重写方法OnStart(),OnStop(),OnContinue(),OnPause()等方法。
同一进程中可以运行多个用户服务。若要将另一个服务添加到此进程
System.ServiceProcess.ServiceBase[] ServicesToRun;
ServicesToRun = new System.ServiceProcess.ServiceBase[] {new startServer()};
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
重写那写方法:
/// <summary>
/// 设置具体的操作,以便服务可以执行它的工作。
/// </summary>
protected override void OnStart(string[] args)
{
qs=new QuoteServer.QuoteServer("c:\\quote.txt",6789);
qs.Start();
}
/// <summary>
/// 停止此服务。
/// </summary>
protected override void OnStop()
{
qs.Stop();
}
protected override void OnContinue()
{
qs.Resume();
}

protected override void OnPause()
{
qs.Suspend();
}
如图:注意:属性AutoLog为True时候,表示将写日志

然后点击其属性的下:“添加安装程序“它会自动创建三个类,其中类“ProjectInstaller“下附带其他两个类
“ServiceProcessInstaller“和“ServiceInstaller“,类ServiceInstaller属性下ServiceName的名称要和服务类
的名称相同,ServiceProcessInstaller属性Account要选择为“本地系统”或本地服务。
类:ServiceProcessInstaller如图

TcpClient client=new TcpClient(); client.Connect(this.txbHostName.Text.Trim(),Convert.ToInt32(this.txbPort.Text.Trim()));
//接受网络的数据
NetworkStream stream=client.GetStream();
byte[] myByte=new byte[1024];
int received=stream.Read(myByte,0,1024);
//接受数据
this.rtbContent.Text=Encoding.Unicode.GetString(myByte);
它的体制有:服务程序的功能、服务控制程序和服务配置程序。服务程序功能本身用于我们想要解决的实际问题;服务控制程序可以把控制请求发给服务,比如开始、停止等;服务配置用于安装服务。
使用网络接口的类:TcpListener
一、 建立服务(创建装配件DLL),它需要端口号、和监听线程。
using System;
using System.IO;
using System.Threading;
using System.Collections.Specialized;
using System.Net.Sockets;
using System.Text;
using System.Net;
namespace QuoteServer
{
/// <summary>
/// 从文件中随机读取一行数据,并把它发送给客户端
/// </summary>
public class QuoteServer
{
//Tcp监听
private TcpListener listener;
private int port; //端口
private string filename;
private StringCollection quotes; //字符串集合
private Random random; //随机数
private Thread ListenThread;//监听线程

构造函数

/// <summary>
/// 读取文件的
/// </summary>
public void readQuotes()
{
quotes=new StringCollection();
//读取文件
Stream st=File.OpenRead(filename);
StreamReader sr=new StreamReader(st);
string quote;
while((quote=sr.ReadLine())!=null)
{
quotes.Add(quote);
}
sr.Close();
st.Close();
random=new Random(); 
}
/// <summary>
/// 得到随机索引
/// </summary>
/// <returns></returns>
protected string getRandomQuoteOfTheDay()
{
int index=random.Next(quotes.Count);
return quotes[index];
}
/// <summary>
/// 启动方法
/// </summary>
public void Start()
{
readQuotes();
ListenThread=new Thread(new ThreadStart(this.Listener));
ListenThread.Start();
}
/// <summary>
/// 进行监听,得到客户的连接,把随机的内容发送给客户
/// </summary>
public void Listener()
{
listener=new TcpListener(port);
listener.Start();
while(true)
{
//等待连接
Socket socket=listener.AcceptSocket();
if(socket==null)
{
return;
}
//把信息发送给客户端
string message=getRandomQuoteOfTheDay();
UnicodeEncoding ue=new UnicodeEncoding();
byte[] buffer=ue.GetBytes(message);
socket.Send(buffer,buffer.Length,0);
socket.Close();
}
}
/// <summary>
/// 关闭监听器
/// </summary>
public void Stop()
{
listener.Stop();
}
/// <summary>
/// 挂起线程
/// </summary>
public void Suspend()
{
ListenThread.Suspend();
}
/// <summary>
/// 重新激活线程
/// </summary>
public void Resume()
{
ListenThread.Resume();
}
/// <summary>
/// 重新得到内容
/// </summary>
public void reflush()
{
readQuotes();
}
}
}
它为创建服务的名称。并重写方法OnStart(),OnStop(),OnContinue(),OnPause()等方法。
System.ServiceProcess.ServiceBase[] ServicesToRun;
ServicesToRun = new System.ServiceProcess.ServiceBase[] {new startServer()};
System.ServiceProcess.ServiceBase.Run(ServicesToRun);
/// <summary>
/// 设置具体的操作,以便服务可以执行它的工作。
/// </summary>
protected override void OnStart(string[] args)
{
qs=new QuoteServer.QuoteServer("c:\\quote.txt",6789);
qs.Start();
}
/// <summary>
/// 停止此服务。
/// </summary>
protected override void OnStop()
{
qs.Stop();
}
protected override void OnContinue()
{
qs.Resume();
}
protected override void OnPause()
{
qs.Suspend();
}

然后点击其属性的下:“添加安装程序“它会自动创建三个类,其中类“ProjectInstaller“下附带其他两个类
“ServiceProcessInstaller“和“ServiceInstaller“,类ServiceInstaller属性下ServiceName的名称要和服务类
的名称相同,ServiceProcessInstaller属性Account要选择为“本地系统”或本地服务。
类:ServiceProcessInstaller如图

类:ServiceInstaller如图:属性StartType指明是手动、自动、还是禁止的,
属性DisplayName为服务的友好名称,目的是监视服务。
然后用命令Installutil.exe工具进行安装或卸载服务,后面直接跟WINDOWS服务名。
安装服务:Installutil windowServer.exe
卸载服务: Installutil /u windowServer.exe
三、客户端应用该服务。采用TcpClient对端口和服务的主机名进行确认
TcpClient client=new TcpClient(); client.Connect(this.txbHostName.Text.Trim(),Convert.ToInt32(this.txbPort.Text.Trim()));
//接受网络的数据
NetworkStream stream=client.GetStream();
byte[] myByte=new byte[1024];
int received=stream.Read(myByte,0,1024);
//接受数据
this.rtbContent.Text=Encoding.Unicode.GetString(myByte);
四、服务安装完,可以使用命令 net start/stop 服务名 ,来启动/停止服务,也可以使用 命令
SC stop 服务名 来停止服务


浙公网安备 33010602011771号