C# 如何在windows services c中设置tcplistener#
我是windows服务的初学者,我有一个控制台应用程序在客户端和服务器之间传输文件。现在,我想将我的服务器应用程序转换为windows服务,用于侦听多个客户端。我将控制台应用程序代码放在onstart()中。部署windows服务后,windows服务无法工作或侦听。任何IQ…都是关于windows服务中TCP侦听器的完整文章。虽然它很旧,但可能会有所帮助。此服务器打开线程,否则将永远不会运行此服务C# 如何在windows services c中设置tcplistener#,c#,windows-services,C#,Windows Services,我是windows服务的初学者,我有一个控制台应用程序在客户端和服务器之间传输文件。现在,我想将我的服务器应用程序转换为windows服务,用于侦听多个客户端。我将控制台应用程序代码放在onstart()中。部署windows服务后,windows服务无法工作或侦听。任何IQ…都是关于windows服务中TCP侦听器的完整文章。虽然它很旧,但可能会有所帮助。此服务器打开线程,否则将永远不会运行此服务 protected override void OnStart(string[] args)
protected override void OnStart(string[] args)
{
TcpServer server=new TcpServer();
server.Start();
}
class TcpServer
{
// clase prar crear un listener
private TcpListener server;
private bool isRunning;
private int port = 13000;
public void Start()
{
// client found.
// create a thread to handle communication
Thread tServer = new Thread(new ParameterizedThreadStart(StartThread));
tServer.Start();
}
public void StartThread(object o)
{
//iniciar configuraciones
Configuracion.init();
// crear un nuevo servidor
server = new TcpListener(IPAddress.Any, port);
//inicializar el servidor
server.Start();
//variable para indicar queesta corriendo el server
isRunning = true;
LoopClients();//thread
}}
public void LoopClients()
{
while (isRunning)
{
// wait for client connection
TcpClient newClient = server.AcceptTcpClient();
// client found.
// create a thread to handle communication
Thread t = new Thread(new ParameterizedThreadStart(HandleClient));
t.Start(newClient);
}
}
嗨,我知道这个问题由来已久,我查阅了stackoverflow或其他网站上的许多文章,但没有人让我满意。最头痛的一点是:它是一个windows服务,在服务启动时不应该阻止侦听器的while循环 最后,我自己制定了一个解决方案,也许它对系统不友好,但它非常简单,运行良好(我同时向该服务器打开了3个telnet,并按照我的意愿运行):-) 代码如下:
`protected override void OnStart(字符串[]args)
{
tcpServerStart();
}
私有void tcpServerStart()
{
尝试
{
IPAddress=IPAddress.Parse(“127.0.0.1”);
//端口5555,或您想要的任何端口号
侦听器=新的TcpListener(ipAddress,5555);
listener.Start();
var whileThread=新线程(()=>
{
while(true)
{
//为了避免while循环变成无限循环,
//我们必须使用AcceptTcpClient()来阻止它。
TcpClient client=listener.AcceptTcpClient();
//对于每个连接,我们只需分叉一个线程来处理它。
var childThread=新线程(()=>
{
//获取用于读写的流对象
NetworkStream=client.GetStream();//不阻止调用
StreamReader StreamReader=新的StreamReader(client.GetStream(),Encoding.ASCII);
字符串行=null;
//下面的循环是您的逻辑代码,请根据您的需要进行更改。
//已将“”定义为我的退出消息
而((line=streamreader.ReadLine())!=“”)
{
//WriteToFile是记录系统状态的函数
写文件(行);
}
stream.Close();
client.Close();
});
childThread.Start();
}//while结束(true)循环
});
whileThread.Start();
}
捕获(例外e)
{
}
} '
您能从运行服务的同一台机器远程登录到该服务吗?
`protected override void OnStart(string[] args)
{
tcpServerStart();
}
private void tcpServerStart()
{
try
{
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
//port 5555, or any port number you want
listener = new TcpListener(ipAddress, 5555);
listener.Start();
var whileThread = new Thread(() =>
{
while (true)
{
// in order to avoid while loop turn into an infinite loop,
// we have to use AcceptTcpClient() to block it.
TcpClient client = listener.AcceptTcpClient();
// for each connection we just fork a thread to handle it.
var childThread = new Thread(() =>
{
// Get a stream object for reading and writing
NetworkStream stream = client.GetStream(); // not blocking call
StreamReader streamreader = new StreamReader(client.GetStream(), Encoding.ASCII);
string line = null;
// below while loop is your logic code, change it to your needs.
// defined "<EOF>" as mine quit message
while ((line = streamreader.ReadLine()) != "<EOF>")
{
// WriteToFile is a function of mineto log system status
WriteToFile(line);
}
stream.Close();
client.Close();
});
childThread.Start();
} // end of while(true) loop
});
whileThread.Start();
}
catch (Exception e)
{
}
} '