C# 如何在windows services c中设置tcplistener#

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)

我是windows服务的初学者,我有一个控制台应用程序在客户端和服务器之间传输文件。现在,我想将我的服务器应用程序转换为windows服务,用于侦听多个客户端。我将控制台应用程序代码放在onstart()中。部署windows服务后,windows服务无法工作或侦听。任何IQ…

都是关于windows服务中TCP侦听器的完整文章。虽然它很旧,但可能会有所帮助。

此服务器打开线程,否则将永远不会运行此服务

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)
    {
    }
}  '