|
|
|
@ -1,4 +1,5 @@ |
|
|
|
|
using System.Net; |
|
|
|
|
using STcpHelper.Packet; |
|
|
|
|
using System.Net; |
|
|
|
|
using System.Net.Sockets; |
|
|
|
|
using System.Text; |
|
|
|
|
|
|
|
|
@ -10,6 +11,7 @@ namespace STcpHelper |
|
|
|
|
|
|
|
|
|
private List<TcpClient> _clients; |
|
|
|
|
|
|
|
|
|
private readonly int HEADER_SIZE = 4; |
|
|
|
|
private readonly int BUFFER_SIZE; |
|
|
|
|
private int _port; |
|
|
|
|
|
|
|
|
@ -47,17 +49,37 @@ namespace STcpHelper |
|
|
|
|
{ |
|
|
|
|
using (NetworkStream stream = client.GetStream()) |
|
|
|
|
{ |
|
|
|
|
byte[] buffer = new byte[BUFFER_SIZE]; |
|
|
|
|
int bytesRead; |
|
|
|
|
byte[] headerBuffer = new byte[HEADER_SIZE]; |
|
|
|
|
byte[] dataBuffer = new byte[BUFFER_SIZE]; |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
while ((bytesRead = await stream.ReadAsync(buffer, 0, BUFFER_SIZE)) > 0) |
|
|
|
|
while (true) |
|
|
|
|
{ |
|
|
|
|
string message = Encoding.UTF8.GetString(buffer, 0, bytesRead); |
|
|
|
|
WriteMessage($"[{client.Client.RemoteEndPoint.ToString()}] {message}"); |
|
|
|
|
|
|
|
|
|
// Broadcast |
|
|
|
|
BroadcastMessage(message, client); |
|
|
|
|
int headerBytesRead = await stream.ReadAsync(headerBuffer, 0, HEADER_SIZE); |
|
|
|
|
if (headerBytesRead != 4) |
|
|
|
|
{ |
|
|
|
|
WriteError(new Exception("Cannot read header")); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
STcpPacketHeader header = new STcpPacketHeader(headerBuffer); |
|
|
|
|
short dataSize = header.DataLength; |
|
|
|
|
int totalRecv = 0; |
|
|
|
|
while (totalRecv < dataSize) |
|
|
|
|
{ |
|
|
|
|
int dataBytesRead = await stream.ReadAsync(dataBuffer, totalRecv, dataSize - totalRecv); |
|
|
|
|
totalRecv += dataBytesRead; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (header.Type == PacketType.TEXT) |
|
|
|
|
{ |
|
|
|
|
STcpTextPacket packet = new STcpTextPacket(dataBuffer); |
|
|
|
|
WriteMessage($"[{client.Client.RemoteEndPoint.ToString()}] Type: {header.Type.ToString()}"); |
|
|
|
|
|
|
|
|
|
// Broadcast |
|
|
|
|
BroadcastMessage(packet.Text, client); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!IsClientConnected(client)) |
|
|
|
|
break; |
|
|
|
@ -81,9 +103,15 @@ namespace STcpHelper |
|
|
|
|
_cts.Cancel(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private byte[] MakeTextPacket(string text) |
|
|
|
|
{ |
|
|
|
|
STcpTextPacket packet = new STcpTextPacket(text); |
|
|
|
|
return packet.Serialize(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void BroadcastMessage(string message, TcpClient sender) |
|
|
|
|
{ |
|
|
|
|
byte[] resonseByte = Encoding.UTF8.GetBytes(message); |
|
|
|
|
byte[] resonseByte = MakeTextPacket(message); |
|
|
|
|
foreach (TcpClient client in _clients) |
|
|
|
|
{ |
|
|
|
|
if (client != sender && IsClientConnected(client)) |
|
|
|
|