add client handlers

main
syneffort 2 years ago
parent 05959ff9a3
commit a5a712a3e4
  1. 68
      SocketStudy/ClientForm/MainForm.cs
  2. 73
      SocketStudy/PComm/PClient.cs
  3. 2
      SocketStudy/PComm/PServer.cs
  4. 6
      SocketStudy/ServerForm/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();
}

@ -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);
}
}
}

@ -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}");
}

@ -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();

Loading…
Cancel
Save