switch to simpletcp library

This commit is contained in:
2022-07-23 09:57:33 -05:00
parent 1deca3e7f3
commit 69b8210362
+77 -49
View File
@@ -1,8 +1,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading; using System.Threading;
using Serilog; using Serilog;
using SuperSimpleTcp;
namespace SharpOSC namespace SharpOSC
{ {
@@ -32,64 +34,36 @@ namespace SharpOSC
private Queue<OscPacket> SendQueue = new Queue<OscPacket>(); private Queue<OscPacket> SendQueue = new Queue<OscPacket>();
private Thread receivingThread;
private Thread sendThread; private Thread sendThread;
string _address; string _address;
TcpClient client;
byte END = 0xc0;
byte ESC = 0xdb;
SimpleTcpClient simpleClient; byte ESC_END = 0xDC;
byte ESC_ESC = 0xDD;
public TCPClient(string address, int port) public TCPClient(string address, int port)
{ {
_port = port; _port = port;
_address = address; _address = address;
simpleClient = new SimpleTcpClient(address, port);
simpleClient.Events.Connected += Connected;
simpleClient.Events.Disconnected += Disconnected;
simpleClient.Events.DataReceived += DataReceived;
simpleClient.Logger = Log.Debug;
}
public static string ByteArrayToString(byte[] ba)
{
return BitConverter.ToString(ba).Replace("-", "");
}
private void DataReceived(object sender, DataReceivedEventArgs e)
{
List<byte[]> messages = SlipFrame.Decode(e.Data);
for(int i = 0; i < messages.Count; i++)
{
OscPacket packet = OscPacket.GetPacket(messages[i]);
OscMessage responseMessage = (OscMessage)packet;
OnMessageReceived(responseMessage);
}
}
private void Disconnected(object sender, ConnectionEventArgs e)
{
Log.Debug("[tcpClient] connection to " + e.IpPort + " was disconnected");
}
private void Connected(object sender, ConnectionEventArgs e)
{
Log.Debug($"[tcpclient] connected to <{e.IpPort}>");
} }
public bool Connect() public bool Connect()
{ {
try try
{ {
simpleClient.Connect(); client = new TcpClient(Address, Port);
receivingThread = new Thread(ReceiveLoop);
receivingThread.Start();
sendThread = new Thread(SendLoop); sendThread = new Thread(SendLoop);
sendThread.IsBackground = true;
sendThread.Start(); sendThread.Start();
Log.Debug($"[tcpclient] connected to <{Address}:{Port}>");
return true; return true;
} }
catch (Exception e) catch (Exception e)
@@ -97,6 +71,7 @@ namespace SharpOSC
Log.Error(e.Message); Log.Error(e.Message);
return false; return false;
} }
} }
public void QueueForSending(OscPacket packet) public void QueueForSending(OscPacket packet)
@@ -106,9 +81,9 @@ namespace SharpOSC
private void SendLoop() private void SendLoop()
{ {
while (simpleClient != null && simpleClient.IsConnected) while (client != null && client.Connected)
{ {
if(SendQueue.Count > 0) if (SendQueue.Count > 0)
{ {
OscPacket packet = SendQueue.Dequeue(); OscPacket packet = SendQueue.Dequeue();
Send(packet); Send(packet);
@@ -119,7 +94,8 @@ namespace SharpOSC
public void Send(byte[] message) public void Send(byte[] message)
{ {
byte[] slipData = SlipFrame.Encode(message); byte[] slipData = SlipFrame.Encode(message);
simpleClient.Send(slipData); NetworkStream netStream = client.GetStream();
netStream.Write(slipData.ToArray(), 0, slipData.ToArray().Length);
} }
public void Send(OscPacket packet) public void Send(OscPacket packet)
@@ -132,22 +108,74 @@ namespace SharpOSC
{ {
get get
{ {
if (simpleClient == null) if (client == null)
return false; return false;
else else
return simpleClient.IsConnected; return client.Connected;
}
}
public void ReceiveLoop()
{
while (client != null && client.Connected)
{
Receive();
}
//Log.Debug("[tcpclient] - ReceiveLoop has exited");
}
public void Receive()
{
Random random = new Random();
int num = random.Next(1000);
try
{
NetworkStream netStream = client.GetStream();
netStream.ReadTimeout = 250;
List<byte> responseData = new List<byte>();
if (netStream.CanRead)
{
//var watch = System.Diagnostics.Stopwatch.StartNew();
byte[] buffer = new byte[256];
int bytesRead = 0;
int reads = 0;
do
{
bytesRead = netStream.Read(buffer, 0, buffer.Length);
responseData.AddRange(buffer);
reads += 1;
Thread.Sleep(1);
//Log.Debug("Thread " + num + ": Bytes read: " + bytesRead + " - " + Encoding.UTF8.GetString(buffer));
} while (netStream.DataAvailable);
//Console.WriteLine("Raw TCP In: " + System.Text.Encoding.UTF8.GetString(responseData.ToArray()));
List<byte[]> messages = SlipFrame.Decode(responseData.ToArray());
foreach(var message in messages)
{
OscPacket packet = OscPacket.GetPacket(message);
OscMessage responseMessage = (OscMessage)packet;
//watch.Stop();
//Console.WriteLine($"TCPCLient - message receive took {watch.ElapsedMilliseconds}ms and {reads} reads");
OnMessageReceived(responseMessage);
}
}
}
catch (Exception e)
{
//Console.WriteLine("TCPSENDER - Receive Exception: " + e.ToString());
} }
} }
public void Close() public void Close()
{ {
Log.Information("[tcpclient] Close() was requested"); if (client != null)
if (simpleClient != null)
{ {
if (simpleClient.IsConnected) if (client.Connected)
{ {
Log.Information($"[tcpClient] closing connection to {Address}"); Log.Debug($"[tcpClient] closing connection to {Address}");
simpleClient.Disconnect(); client.GetStream().Close();
client.Close();
} }
} }
} }