using System.Collections.Generic;
using System.Net;
using System.Threading;
namespace BF
{
internal partial class TCPChannelService : INetChannelService
{
private NetConfiguration configuration;
private Thread networkThread;
///
/// 主线程同步
///
private readonly AutoResetEvent mainThreadResetEvent;
private readonly NetSafeQueue commandMethodQueue = new NetSafeQueue(2);
public NetServiceType ServiceType => configuration.ServiceType;
public TCPChannelService()
{
mainThreadResetEvent = new AutoResetEvent(false);
}
~TCPChannelService()
{
mainThreadResetEvent?.Dispose();
quitEvent?.Dispose();
}
public void Start(NetConfiguration configuration)
{
this.configuration = configuration;
networkThread = new Thread(new ThreadStart(NetworkLoop))
{
IsBackground = true,
Name = configuration.ThreadName
};
networkThread.Start();
}
public void Shutdown()
{
var commandMethod = ShutdownMethod.DefaultInstance;
commandMethod.ResetMethod();
commandMethodQueue.Enqueue(commandMethod);
quitEvent.Set();
mainThreadResetEvent.WaitOne();
quitFlag = true;
quitEvent.Reset();
}
public void Connect(NetConnectConfiguration configuration, string domainName, int port)
{
var commandMethod = ConnectDomainNameMethod.DefaultInstance;
commandMethod.ResetMethod();
commandMethod.Configuration = configuration;
commandMethod.DomainName = domainName;
commandMethod.Port = port;
commandMethodQueue.Enqueue(commandMethod);
mainThreadResetEvent.WaitOne();
}
public void Connect(NetConnectConfiguration configuration, IPAddress ipAddress, int port)
{
var commandMethod = ConnectIPAddressMethod.DefaultInstance;
commandMethod.ResetMethod();
commandMethod.Configuration = configuration;
commandMethod.IpAddress = ipAddress;
commandMethod.Port = port;
commandMethodQueue.Enqueue(commandMethod);
mainThreadResetEvent.WaitOne();
}
public void Reconnect(string uniqueIdentifier)
{
var commandMethod = ReconnectMethod.DefaultInstance;
commandMethod.ResetMethod();
commandMethod.UniqueIdentifier = uniqueIdentifier;
commandMethodQueue.Enqueue(commandMethod);
mainThreadResetEvent.WaitOne();
}
public void Close(string uniqueIdentifier)
{
var commandMethod = CloseMethod.DefaultInstance;
commandMethod.ResetMethod();
commandMethod.UniqueIdentifier = uniqueIdentifier;
commandMethodQueue.Enqueue(commandMethod);
mainThreadResetEvent.WaitOne();
}
public NetConnectStatus GetConnectStatus(string uniqueIdentifier)
{
var commandMethod = GetConnectStatusMethod.DefaultInstance;
commandMethod.ResetMethod();
commandMethod.UniqueIdentifier = uniqueIdentifier;
commandMethodQueue.Enqueue(commandMethod);
mainThreadResetEvent.WaitOne();
return commandMethod.Result;
}
public string GetConnectIP(string uniqueIdentifier)
{
var commandMethod = GetConnectIPMethod.DefaultInstance;
commandMethod.ResetMethod();
commandMethod.UniqueIdentifier = uniqueIdentifier;
commandMethodQueue.Enqueue(commandMethod);
mainThreadResetEvent.WaitOne();
return commandMethod.Result;
}
public long GetConnectServerTimestamp(string uniqueIdentifier)
{
var commandMethod = GetConnectServerTimestampMethod.DefaultInstance;
commandMethod.ResetMethod();
commandMethod.UniqueIdentifier = uniqueIdentifier;
commandMethodQueue.Enqueue(commandMethod);
mainThreadResetEvent.WaitOne();
return commandMethod.Result;
}
public INetOutgoingMessage CreateMessage(string uniqueIdentifier)
{
var commandMethod = CreateMessageMethod.DefaultInstance;
commandMethod.ResetMethod();
commandMethod.UniqueIdentifier = uniqueIdentifier;
commandMethodQueue.Enqueue(commandMethod);
mainThreadResetEvent.WaitOne();
return commandMethod.Result;
}
public NetSendResult Send(string uniqueIdentifier, INetOutgoingMessage message)
{
var commandMethod = SendMessageMethod.DefaultInstance;
commandMethod.ResetMethod();
commandMethod.UniqueIdentifier = uniqueIdentifier;
commandMethod.Message = message;
commandMethodQueue.Enqueue(commandMethod);
mainThreadResetEvent.WaitOne();
return commandMethod.Result;
}
public NetSendResult Send(string uniqueIdentifier, uint group, byte cmd, byte[] data)
{
var commandMethod = SendRawMethod.DefaultInstance;
commandMethod.ResetMethod();
commandMethod.UniqueIdentifier = uniqueIdentifier;
commandMethod.Group = group;
commandMethod.CMD = cmd;
commandMethod.Data = data;
commandMethodQueue.Enqueue(commandMethod);
mainThreadResetEvent.WaitOne();
return commandMethod.Result;
}
public INetIncomingMessage ReadMessage(string uniqueIdentifier)
{
var commandMethod = ReadMessageMethod.DefaultInstance;
commandMethod.ResetMethod();
commandMethod.UniqueIdentifier = uniqueIdentifier;
commandMethodQueue.Enqueue(commandMethod);
mainThreadResetEvent.WaitOne();
return commandMethod.Result;
}
public void RecycleMessage(string uniqueIdentifier, INetIncomingMessage message)
{
var commandMethod = RecycleMessageMethod.DefaultInstance;
commandMethod.ResetMethod();
commandMethod.UniqueIdentifier = uniqueIdentifier;
commandMethod.Message = message;
commandMethodQueue.Enqueue(commandMethod);
mainThreadResetEvent.WaitOne();
}
}
}