【发布时间】:2016-07-30 16:54:39
【问题描述】:
我创建了一个 Windows 服务,它将打开端口并将数据记录在文本文件中。它是异步数据通信,允许连接多个客户端。但我的问题是它没有创建任何日志文件,也没有记录任何数据。请指导我哪里做错了??? 这是我的代码...
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using System.IO;
namespace TcpService
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
SetupServer();
}
public void OnDebug()
{
OnStart(null);
}
protected override void OnStop()
{
Service1._serverSocket = null;
}
private static byte[] _buffer = new byte[1024];
private static List<Socket> _ClientSockets = new List<Socket>();
private static int port = 10000;
private static IPAddress iparr = IPAddress.Parse("192.168.1.12");
private static Socket _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private static void SetupServer()
{
//Console.WriteLine("Setting Up server");
_serverSocket.Bind(new IPEndPoint(iparr, port));
_serverSocket.Listen(100);
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
private static void AcceptCallback(IAsyncResult AR)
{
Socket socket = _serverSocket.EndAccept(AR);
_ClientSockets.Add(socket);
//Console.WriteLine("Client Connected");
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket);
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
private static void ReceiveCallback(IAsyncResult AR)
{
try
{
SocketError errorCode;
Socket socket = (Socket)AR.AsyncState;
int received = socket.EndReceive(AR, out errorCode);
if (errorCode != SocketError.Success)
{
received = 0;
}
byte[] databuf = new byte[received];
Array.Copy(_buffer, databuf, received);
string text = BitConverter.ToString(databuf);
string time = DateTime.Now.TimeOfDay.ToString();
string dataline = time + "____" + text;
AddtoLogFile(dataline);
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket);
}
catch (Exception ex)
{
}
}
private static void AddtoLogFile(string Message)
{
string LogPath = @"D:\\Logfile\\";
string filename = "Log_" + DateTime.Now.ToString("dd-MM-yyyy") + ".txt";
string filepath = LogPath + filename;
if (File.Exists(filepath))
{
using (StreamWriter writer = new StreamWriter(filepath, true))
{
writer.WriteLine(Message);
}
}
else
{
StreamWriter writer = File.CreateText(filepath);
writer.WriteLine(Message);
writer.Close();
}
}
}
}
【问题讨论】:
-
那么,当你调试这段代码时,会发生什么?因为我假设您已经对其进行了调试以找出它为什么不创建您的日志文件。
-
对不起,我错过了......当我调试上面的代码时它正在创建文件但没有记录数据......
-
空异常呢? “catch (Exception ex) {...}” 可能是这里的东西...
-
Nothing ...当客户端断开连接时...异常将被捕获,并且控制台将显示客户端断开连接,因为我不需要客户端断开连接时间的时间我没有给出任何异常代码...
-
因为你也放了“AddtoLogFile(dataline);”在 try 块内。这意味着如果 LogFile 中出现 AccessDenied 之类的错误,则该异常也消失了。你永远不会知道,你的日志文件出了什么问题。
标签: c# windows-services background-process tcpclient