Отправка сообщения от сервера клиенту на консоль - C#
Формулировка задачи:
Ребят, подскажите пожалуйста, в момент удачной записи данных в файл (на стороне сервера выполняется запись в файл), нужно клиенту от сервера отправить на консоль сообщение что все ОК, или ERROR, в случае непредвиденных событий.. В коде клиента в классе TcpWriter я определил метод Response(), а в коде сервера в классе ClientObjects в блоке try пишу:
В итоге мне в консоль клиента выводится только 1 раз сообщение "Успешно". А должно выводить:
Успешно
Успешно
Успешно
...........
Код сервера:
и код клиента
Спасибо заранее!
string sendmsg = "Успешно"; data = Encoding.Unicode.GetBytes(sendmsg); stream.Write(data, 0, data.Length);
namespace Server
{
public class ClientObject
{
public TcpClient client;
public ClientObject(TcpClient tcpClient)
{
client = tcpClient;
}
public void Process()
{
NetworkStream stream = null;
try
{
stream = client.GetStream();
byte[] data = new byte[64]; // буфер для получаемых данных
while (true)
{
// получаем сообщение
StringBuilder builder = new StringBuilder();
int bytes = 0;
do
{
bytes = stream.Read(data, 0, data.Length);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (stream.DataAvailable);
string message = builder.ToString() + "\r\n";
Console.WriteLine("Записываю в log {0}", message);
try
{
using (FileStream fstream = new FileStream("log.txt", FileMode.Append))
{
// преобразуем строку в байты
byte[] array = Encoding.Default.GetBytes(message);
// запись массива байтов в файл
fstream.Write(array, 0, array.Length);
//Console.WriteLine("Текст записан в файл");
}
}
catch (Exception ex)
{
//
// ERROR MESSAGE TO CLIENT
//message = ex.Message;
//data = Encoding.Unicode.GetBytes(message);
//stream.Write(data, 0, data.Length);
}
string sendmsg = "Успешно";
data = Encoding.Unicode.GetBytes(sendmsg);
stream.Write(data, 0, data.Length);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (stream != null)
stream.Close();
if (client != null)
client.Close();
}
}
}
}
namespace Server
{
class Program
{
const int port = 8888;
static TcpListener listener;
static void Main(string[] args)
{
try
{
var aTimer = new System.Timers.Timer();
//65454
aTimer.Interval = 65500;
aTimer.AutoReset = true;
aTimer.Start();
listener = new TcpListener(IPAddress.Parse("127.0.0.1"), port);
listener.Start();
aTimer.Elapsed += OnTimedEvent;
Console.WriteLine("Ожидание подключений...");
while (true)
{
TcpClient client = listener.AcceptTcpClient();
ClientObject clientObject = new ClientObject(client);
// создаем новый поток для обслуживания нового клиента
Thread clientThread = new Thread(new ThreadStart(clientObject.Process));
clientThread.Start();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (listener != null)
listener.Stop();
}
}
private static void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
{
// Check file access
//delete file's old content
var file = new FileInfo("log.txt");
try
{
//stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);
string[] lines = File.ReadAllLines(@"log.txt");
StringBuilder newLines = new StringBuilder();
foreach (var line in lines)
{
var date = Convert.ToDateTime(line.Substring(line.IndexOf(' ') + 1));
var currentTime = DateTime.Now;
double minuts = -1;
if(date>=currentTime.AddMinutes(minuts))
{
newLines.Append(line + "\r\n");
}
}
Console.WriteLine("Cleaning...");
using (FileStream fstream = new FileStream("log.txt", FileMode.Create))
{
// запись массива байтов в файл
byte[] array = Encoding.Default.GetBytes(newLines.ToString() + "\r\n");
fstream.Write(array, 0, array.Length);
}
}
catch (IOException)
{
//the file is unavailable because it is:
//still being written to
//or being processed by another thread
//or does not exist (has already been processed)
}
}
}
}namespace Client
{
class TcpWriter
{
TcpClient client;
NetworkStream stream;
int packNum = 0;
int maxPackNum;
public TcpWriter(int port, string address, int maxPackNum)
{
client = new TcpClient(address, port);
stream = client.GetStream();
this.maxPackNum = maxPackNum;
}
public void Response()
{
byte[] data = new byte[64]; // буфер для получаемых данных
StringBuilder builder = new StringBuilder();
int bytes = 0;
do
{
bytes = stream.Read(data, 0, data.Length);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (stream.DataAvailable);
string msg = builder.ToString();
Console.WriteLine("Сервер: {0}", msg);
}
public void Run()
{
System.Timers.Timer myTimer = new System.Timers.Timer();
myTimer.Elapsed += new ElapsedEventHandler(MessageEvent);
myTimer.Interval = 1000;
myTimer.Start();
Response();
}
public void MessageEvent(object source, ElapsedEventArgs e)
{
string message = string.Format("{0}: {1}", packNum++, DateTime.Now);
byte[] data = Encoding.Unicode.GetBytes(message);
stream.Write(data, 0, data.Length);
if (packNum > maxPackNum)
{
(source as System.Timers.Timer).Stop();
client.Close();
}
}
}
}
namespace Client
{
class Program
{
static void Main(string[] args)
{
try
{
TcpWriter tcpWriter = new TcpWriter(8888, "127.0.0.1", 1000);
tcpWriter.Run();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
}
}Решение задачи: «Отправка сообщения от сервера клиенту на консоль»
textual
Листинг программы
for (; ; ) Response();