diff --git a/SocketStudy/ClientForm/MainForm.cs b/SocketStudy/ClientForm/MainForm.cs index bb26f86..78efc17 100644 --- a/SocketStudy/ClientForm/MainForm.cs +++ b/SocketStudy/ClientForm/MainForm.cs @@ -15,6 +15,9 @@ using System.Windows.Forms; namespace ClientForm { + delegate void LogHandler(PClient client, string log); + delegate void FormHandler(Form form); + public partial class MainForm : Form { private readonly string SERVER_IP = "124.56.13.173";//"10.233.96.172", "124.56.13.173"; @@ -22,6 +25,9 @@ namespace ClientForm private PClient heartBeatClient; private PClient client; + private LogHandler logHandler; + private FormHandler formHandler; + private System.Timers.Timer heartBeatTimer; private System.Timers.Timer GarbageTimer; @@ -36,11 +42,22 @@ namespace ClientForm string clientId = PUtil.GetRandomString(5); string heartBeatClientId = clientId + "_hb"; + logHandler = new LogHandler(WriteLog); + formHandler = new FormHandler(ShowForm); + heartBeatClient = new PClient(SERVER_IP, 37778, heartBeatClientId); + heartBeatClient.OnConnected += CommonClient_OnConnected; + heartBeatClient.OnSend += HeartBeatClient_OnSend; heartBeatClient.OnReceived += HeartBeatClient_OnReceived; + heartBeatClient.OnErrorCatched += CommonClient_OnErrorCatched; + heartBeatClient.OnDisconnected += CommonClient_OnDisconnected; client = new PClient(SERVER_IP, 37777, clientId); + client.OnConnected += CommonClient_OnConnected; + client.OnSend += Client_OnSend; client.OnReceived += Client_OnReceived; + client.OnErrorCatched += CommonClient_OnErrorCatched; + client.OnDisconnected += CommonClient_OnDisconnected; heartBeatTimer = new System.Timers.Timer(); heartBeatTimer.Interval = 1000 * 10; @@ -53,15 +70,56 @@ namespace ClientForm GarbageTimer.Start(); } - private void WriteLog(string log) + private void Client_OnSend(PClient sender, PDataType dataType, byte[] data) + { + string log = $"Send data: target: {sender.EndPoint.ToString()}, type: {dataType.ToString()}, size: {data.Length.ToString("#,###")}"; + logHandler(client, log); + } + + private void CommonClient_OnDisconnected(PClient sender) + { + string log = $"Disconnected: {sender.EndPoint.ToString()}"; + logHandler(client, log); + } + + private void CommonClient_OnErrorCatched(PClient sender, string msg) + { + string log = $"Error: {msg}"; + logHandler(client, log); + } + + private void HeartBeatClient_OnSend(PClient sender, PDataType dataType, byte[] data) + { + //throw new NotImplementedException(); + } + + private void CommonClient_OnConnected(PClient sender) + { + string log = $"Connected: {sender.EndPoint.ToString()}"; + logHandler(client, log); + } + + private void ShowForm(Form form) + { + if (this.InvokeRequired) + { + this.Invoke((MethodInvoker)delegate () { ShowForm(form); }); + } + else + { + form.Show(); + } + } + + private void WriteLog(PClient client,string log) { if (this.InvokeRequired) { - Invoke((MethodInvoker)delegate () { WriteLog(log); }); + this.Invoke((MethodInvoker)delegate () { WriteLog(client, log); }); } else { - logConsole.AppendText($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}] {log}" + Environment.NewLine); + logConsole.AppendText($"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}] {client.ID}: {log}" + Environment.NewLine); //PUtil.ScrollToEnd(logConsole); } } @@ -75,14 +133,14 @@ namespace ClientForm { if (dataType != PDataType.SimpleString) { - WriteLog("ERROR!!! WRONG DATA TYPE FOR HEART BEAT!!!"); + WriteLog(sender, "ERROR!!! WRONG DATA TYPE FOR HEART BEAT!!!"); return; } string msg = Encoding.UTF8.GetString(data, 0, data.Length); if (msg != PServer.HB_CHECK) { - WriteLog("WARNING!!! BAD HEARTBEAT!!!"); + WriteLog(sender, "WARNING!!! BAD HEARTBEAT!!!"); client.Connect(); heartBeatClient.Connect(); } diff --git a/SocketStudy/PComm/PClient.cs b/SocketStudy/PComm/PClient.cs index 212701f..2b1689f 100644 --- a/SocketStudy/PComm/PClient.cs +++ b/SocketStudy/PComm/PClient.cs @@ -17,11 +17,20 @@ namespace PComm { private readonly int BUFF_SIZE = 1000 * 50; // 50kB + public delegate void ClientConnectedHandler(PClient sender); + public event ClientConnectedHandler OnConnected; + + public delegate void ErrorHandler(PClient sender, string msg); + public event ErrorHandler OnErrorCatched; + + public delegate void ClientSendHander(PClient sender, PDataType dataType, byte[] data); + public event ClientSendHander OnSend; + public delegate void ClientReceivedHandler(PClient sender, PDataType dataType, byte[] data); public event ClientReceivedHandler OnReceived; public delegate void ClientDisconnectedHandler(PClient sender); - public event ClientDisconnectedHandler Disconnected; + public event ClientDisconnectedHandler OnDisconnected; public string ID { get; set; } @@ -72,6 +81,8 @@ namespace PComm try { socket.Connect(this.EndPoint); + if (OnConnected != null) + OnConnected(this); // send ID this.Send(PDataType.ClientID, Encoding.UTF8.GetBytes(this.ID)); @@ -80,8 +91,11 @@ namespace PComm } catch(Exception ex) { - Debug.WriteLine($"[ERROR] Socket connect fail({this.EndPoint.ToString()}): {ex.Message}"); - PFileManager.Instance.WriteLog($"[ERROR] Socket connect fail({this.EndPoint.ToString()}): {ex.Message}"); + string msg = $"Socket connect fail({this.EndPoint.ToString()}, {ex.Message})"; + Debug.WriteLine(msg); + PFileManager.Instance.WriteLog(msg); + if (OnErrorCatched != null) + OnErrorCatched(this, msg); Connect(); } @@ -98,8 +112,11 @@ namespace PComm } catch (Exception ex) { - Debug.WriteLine($"[ERROR] Socket send: {ex.Message}"); - PFileManager.Instance.WriteLog($"[ERROR] Socket send: {ex.Message}"); + string msg = $"Socket send fail ({ex.Message})"; + Debug.WriteLine(msg); + PFileManager.Instance.WriteLog(msg); + if (OnErrorCatched != null) + OnErrorCatched(this, msg); if (CheckSocketConnection(socket)) { @@ -107,13 +124,16 @@ namespace PComm } else { - Debug.WriteLine($"[ERROR] Socket close {this.EndPoint.ToString()}"); - PFileManager.Instance.WriteLog($"[ERROR] Socket close {this.EndPoint.ToString()}"); + msg = $"Socket close ({this.EndPoint.ToString()})"; + Debug.WriteLine(msg); + PFileManager.Instance.WriteLog(msg); + if (OnErrorCatched != null) + OnErrorCatched(this, msg); Close(); - if (Disconnected != null) - Disconnected(this); + if (OnDisconnected != null) + OnDisconnected(this); } return 0; @@ -122,7 +142,6 @@ namespace PComm private int SendByProtocol(PDataType dataType, byte[] data) { - byte[] type = BitConverter.GetBytes((int)dataType); SendToSocket(type); @@ -145,13 +164,11 @@ namespace PComm byte[] length = BitConverter.GetBytes(toSendData.Length); SendToSocket(length); - return SendToSocket(toSendData); - } + int sendByteSize = SendToSocket(toSendData); + if (OnSend != null) + OnSend(this, dataType, toSendData); - public int Send(string msg) - { - byte[] data = Encoding.UTF8.GetBytes(msg); - return Send(PDataType.SimpleString, data); + return sendByteSize; } public int Send(PDataType dataType, byte[] data) @@ -159,6 +176,12 @@ namespace PComm return SendByProtocol(dataType, data); } + public int Send(string msg) + { + byte[] data = Encoding.UTF8.GetBytes(msg); + return Send(PDataType.SimpleString, data); + } + private void AcceptCallback(IAsyncResult ar) { try @@ -218,8 +241,11 @@ namespace PComm } catch (Exception ex) { - Debug.WriteLine($"[ERROR] Socket receive: {ex.Message}"); - PFileManager.Instance.WriteLog($"[ERROR] Socket receive: {ex.Message}"); + string msg = $"Socket receive fail ({ex.Message})"; + Debug.WriteLine(msg); + PFileManager.Instance.WriteLog(msg); + if (OnErrorCatched != null) + OnErrorCatched(this, msg); if (CheckSocketConnection(socket)) { @@ -227,13 +253,16 @@ namespace PComm } else { - Debug.WriteLine($"[ERROR] Socket close {socket.RemoteEndPoint.ToString()}"); - PFileManager.Instance.WriteLog($"[ERROR] Socket close {socket.RemoteEndPoint.ToString()}"); + msg = $"Socket close ({socket.RemoteEndPoint.ToString()})"; + Debug.WriteLine(msg); + PFileManager.Instance.WriteLog(msg); + if (OnErrorCatched != null) + OnErrorCatched(this, msg); Close(); - if (Disconnected != null) - Disconnected(this); + if (OnDisconnected != null) + OnDisconnected(this); } } } diff --git a/SocketStudy/PComm/PServer.cs b/SocketStudy/PComm/PServer.cs index 860f00f..4178fe9 100644 --- a/SocketStudy/PComm/PServer.cs +++ b/SocketStudy/PComm/PServer.cs @@ -44,7 +44,7 @@ namespace PComm { PClient client = new PClient(e.Accepted); client.OnReceived += Client_OnReceived; - client.Disconnected += Client_Disconnected; + client.OnDisconnected += Client_Disconnected; Debug.WriteLine($"[{ DateTime.Now}] Temp client accepted: {client.ID}"); } diff --git a/SocketStudy/ServerForm/mainForm.cs b/SocketStudy/ServerForm/mainForm.cs index ce1a4d9..71f7a0e 100644 --- a/SocketStudy/ServerForm/mainForm.cs +++ b/SocketStudy/ServerForm/mainForm.cs @@ -44,12 +44,12 @@ namespace ServerForm heartBeatServer = new PServer(HB_PORT); mainServer = new PServer(PORT); - heartBeatServer.OnDataReceived += HeartBeatServer_OnDataReceived; - mainServer.OnDataReceived += MainServer_OnDataReceived; - logHandler = new LogHandler(WriteLog); formHandler = new FormHandler(ShowForm); + heartBeatServer.OnDataReceived += HeartBeatServer_OnDataReceived; + mainServer.OnDataReceived += MainServer_OnDataReceived; + heartBeatServer.Start(); mainServer.Start();