mirror of
https://github.com/jwetzell/QControlKit.git
synced 2026-08-22 07:29:07 +00:00
switch to simpletcp library
This commit is contained in:
@@ -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,71 +34,44 @@ 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)
|
||||||
{
|
{
|
||||||
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -157,4 +185,4 @@ namespace SharpOSC
|
|||||||
MessageReceived?.Invoke(this, new MessageEventArgs() { Message = msg });
|
MessageReceived?.Invoke(this, new MessageEventArgs() { Message = msg });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user