update send, receive logic

main
syneffort 2 years ago
parent b8f92bf3b5
commit 0897afeb92
  1. 2
      SocketStudy/Client/PClientSocket.cs
  2. 75
      SocketStudy/PComm/PClient.cs
  3. 11
      SocketStudy/PUtil/PFileManager.cs

@ -11,7 +11,7 @@ namespace Client
{ {
class PClientSocket class PClientSocket
{ {
private readonly int BUFF_SIZE = 8192; private readonly int BUFF_SIZE = 1024 * 50;
private Socket sock; private Socket sock;
private IPEndPoint endPoint; private IPEndPoint endPoint;

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

@ -41,7 +41,16 @@ namespace PUtility
DateTime now = DateTime.Now; DateTime now = DateTime.Now;
string logPath = Path.Combine(this.LogDirPath, $"[{now.ToString("yyyyMMdd")}]log.txt"); string logPath = Path.Combine(this.LogDirPath, $"[{now.ToString("yyyyMMdd")}]log.txt");
File.AppendAllText(logPath, $"[{now.ToString("yyyyMMdd HH:mm:ss")}] {log + Environment.NewLine}"); using (FileStream fs = new FileStream(logPath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
{
using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))
{
sw.WriteLine($"[{now.ToString("yyyyMMdd HH:mm:ss")}] {log + Environment.NewLine}");
sw.Flush();
}
}
//File.AppendAllText(logPath, $"[{now.ToString("yyyyMMdd HH:mm:ss")}] {log + Environment.NewLine}");
} }
} }
} }

Loading…
Cancel
Save