|
|
|
@ -8,13 +8,14 @@ using System.Linq; |
|
|
|
|
using System.Net; |
|
|
|
|
using System.Net.Sockets; |
|
|
|
|
using System.Text; |
|
|
|
|
using System.Threading; |
|
|
|
|
using System.Threading.Tasks; |
|
|
|
|
|
|
|
|
|
namespace PComm |
|
|
|
|
{ |
|
|
|
|
public class PClient |
|
|
|
|
{ |
|
|
|
|
//private readonly int BUFF_SIZE = 8192; |
|
|
|
|
private readonly int BUFF_SIZE = 1024 * 50; |
|
|
|
|
|
|
|
|
|
public delegate void ClientReceivedHandler(PClient sender, PDataType dataType, byte[] data); |
|
|
|
|
public event ClientReceivedHandler OnReceived; |
|
|
|
@ -28,7 +29,7 @@ namespace PComm |
|
|
|
|
|
|
|
|
|
public bool Connected { get { return socket.Connected; } } |
|
|
|
|
|
|
|
|
|
public bool DataCompression { get; set; } = false; |
|
|
|
|
public bool DataCompression { get; set; } = true; |
|
|
|
|
|
|
|
|
|
private Socket socket; |
|
|
|
|
|
|
|
|
@ -70,48 +71,69 @@ namespace PComm |
|
|
|
|
socket.BeginReceive(new byte[] { 0 }, 0, 0, 0, AcceptCallback, null); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int SendToSocket(byte[] buffer) |
|
|
|
|
{ |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
return socket.Send(buffer, SocketFlags.None); |
|
|
|
|
} |
|
|
|
|
catch (Exception ex) |
|
|
|
|
{ |
|
|
|
|
Debug.WriteLine($"[ERROR] Socket send: {ex.Message}"); |
|
|
|
|
PFileManager.Instance.WriteLog($"[ERROR] Socket send: {ex.Message}"); |
|
|
|
|
|
|
|
|
|
if (CheckSocketConnection(socket)) |
|
|
|
|
{ |
|
|
|
|
socket.BeginReceive(new byte[] { 0 }, 0, 0, 0, AcceptCallback, null); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
Debug.WriteLine($"[ERROR] Socket close {socket.RemoteEndPoint.ToString()}"); |
|
|
|
|
PFileManager.Instance.WriteLog($"[ERROR] Socket close {socket.RemoteEndPoint.ToString()}"); |
|
|
|
|
|
|
|
|
|
Close(); |
|
|
|
|
|
|
|
|
|
if (Disconnected != null) |
|
|
|
|
Disconnected(this); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private int SendData(byte[] data) |
|
|
|
|
{ |
|
|
|
|
byte[] isCompressed; |
|
|
|
|
byte[] toSendData; |
|
|
|
|
// 데이터 크기 100B 이하 또는 50MB 이상 압축하지 않음 (CPU 부하시간 더 큼) |
|
|
|
|
// 압축한 경우 1 전송, 아닌경우 0 전송 |
|
|
|
|
if (DataCompression == false || data.Length <= 100 || data.Length >= 50000000) |
|
|
|
|
{ |
|
|
|
|
byte[] isCompressed = BitConverter.GetBytes(false); |
|
|
|
|
socket.Send(isCompressed, SocketFlags.None); |
|
|
|
|
isCompressed = BitConverter.GetBytes(false); |
|
|
|
|
toSendData = data; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
byte[] isCompressed = BitConverter.GetBytes(true); |
|
|
|
|
socket.Send(isCompressed, SocketFlags.None); |
|
|
|
|
isCompressed = BitConverter.GetBytes(true); |
|
|
|
|
toSendData = PUtil.CompressBytes(data, CompressionLevel.Optimal); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
SendToSocket(isCompressed); |
|
|
|
|
byte[] length = BitConverter.GetBytes(toSendData.Length); |
|
|
|
|
socket.Send(length, 0, 4, SocketFlags.None); |
|
|
|
|
SendToSocket(length); |
|
|
|
|
|
|
|
|
|
return socket.Send(toSendData, SocketFlags.None); |
|
|
|
|
return SendToSocket(toSendData); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public int Send(string msg) |
|
|
|
|
{ |
|
|
|
|
socket.Send(BitConverter.GetBytes((int)PDataType.SimpleString), 0, 4, 0); |
|
|
|
|
byte[] data = Encoding.UTF8.GetBytes(msg); |
|
|
|
|
//byte[] length = BitConverter.GetBytes(data.Length); |
|
|
|
|
//socket.Send(length, 0, 4, 0); |
|
|
|
|
|
|
|
|
|
//return socket.Send(data, SocketFlags.None); |
|
|
|
|
return SendData(data); |
|
|
|
|
return Send(PDataType.SimpleString, data); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public int Send(PDataType dataType, byte[] data) |
|
|
|
|
{ |
|
|
|
|
socket.Send(BitConverter.GetBytes((int)dataType), 0, 4, 0); |
|
|
|
|
//byte[] length = BitConverter.GetBytes(data.Length); |
|
|
|
|
//socket.Send(length, 0, 4, 0); |
|
|
|
|
|
|
|
|
|
//return socket.Send(data, SocketFlags.None); |
|
|
|
|
socket.Send(BitConverter.GetBytes((int)dataType), SocketFlags.None); |
|
|
|
|
return SendData(data); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -136,19 +158,20 @@ namespace PComm |
|
|
|
|
socket.Receive(sizeBuff, sizeBuff.Length, SocketFlags.None); |
|
|
|
|
int dataSize = BitConverter.ToInt32(sizeBuff, 0); |
|
|
|
|
|
|
|
|
|
// ready to receive data; |
|
|
|
|
Thread.Sleep(100); |
|
|
|
|
|
|
|
|
|
using (MemoryStream ms = new MemoryStream()) |
|
|
|
|
{ |
|
|
|
|
while (dataSize > 0) |
|
|
|
|
{ |
|
|
|
|
byte[] buff; |
|
|
|
|
if (dataSize < socket.ReceiveBufferSize) |
|
|
|
|
if (dataSize < BUFF_SIZE) |
|
|
|
|
buff = new byte[dataSize]; |
|
|
|
|
else |
|
|
|
|
buff = new byte[socket.ReceiveBufferSize]; |
|
|
|
|
buff = new byte[BUFF_SIZE]; |
|
|
|
|
|
|
|
|
|
int receiveSize = socket.Receive(buff, buff.Length, SocketFlags.None); |
|
|
|
|
//int receiveSize = socket.Receive(buff, buff.Length, SocketFlags.None); |
|
|
|
|
|
|
|
|
|
ms.Write(buff, 0, buff.Length); |
|
|
|
|
dataSize -= receiveSize; |
|
|
|
@ -169,8 +192,8 @@ namespace PComm |
|
|
|
|
} |
|
|
|
|
catch (Exception ex) |
|
|
|
|
{ |
|
|
|
|
Debug.WriteLine($"[ERROR] CleintAcceptCallback: {ex.Message}"); |
|
|
|
|
PFileManager.Instance.WriteLog($"[ERROR] CleintAcceptCallback: {ex.Message}"); |
|
|
|
|
Debug.WriteLine($"[ERROR] Socket receive: {ex.Message}"); |
|
|
|
|
PFileManager.Instance.WriteLog($"[ERROR] Socket receive: {ex.Message}"); |
|
|
|
|
|
|
|
|
|
if (CheckSocketConnection(socket)) |
|
|
|
|
{ |
|
|
|
@ -178,8 +201,8 @@ namespace PComm |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
Debug.WriteLine($"[ERROR] Close socket {socket.RemoteEndPoint.ToString()}"); |
|
|
|
|
PFileManager.Instance.WriteLog($"[ERROR] Close socket {socket.RemoteEndPoint.ToString()}"); |
|
|
|
|
Debug.WriteLine($"[ERROR] Socket close {socket.RemoteEndPoint.ToString()}"); |
|
|
|
|
PFileManager.Instance.WriteLog($"[ERROR] Socket close {socket.RemoteEndPoint.ToString()}"); |
|
|
|
|
|
|
|
|
|
Close(); |
|
|
|
|
|
|
|
|
|