1、TcpListener 监听类
2、TcpListener .AcceptTcpClient() 用线程监听客服端连接
3、TcpClient用线程监听客服端传输数据
public class TcpAdapter : IDisposable
{
private const int THREAD_TIME_SPAN = 10;
private const int RECIEVE_BUFFER_LENGTH = 1024 * 1024 * 5;
private RecieveDataHandler m_recieveDataHanlder;
private TcpClient m_tcpClient;
private TcpListener m_tcplistener;
private IPEndPoint m_localPoint;
private NetworkStream m_networkStream;
private Thread m_recieveThread;
private Thread m_sendThread;
private bool m_running;
private ConcurrentQueue<byte[]> sendBuffers;
private byte[] recieveBuffer;
private bool m_init;
public TcpAdapter(IPEndPoint localPoint, RecieveDataHandler recieveDataHandler)
{
recieveBuffer = new byte[RECIEVE_BUFFER_LENGTH];
sendBuffers = new ConcurrentQueue<byte[]>();
m_recieveDataHanlder = recieveDataHandler;
m_localPoint = localPoint;
m_tcplistener = new TcpListener(localPoint);
m_recieveThread = new Thread(RunTcpListener);
m_recieveThread.Name = "TCP_ADAPTER_TCP_RECIEVE_THREAD";
m_recieveThread.IsBackground = true;
}
private void RunTcpListener()
{
while (m_running)
{
try
{
var client = m_tcplistener.AcceptTcpClient();
//链接对象
var stream = client.GetStream();
string ipport = client.Client.RemoteEndPoint.ToString();
string ip = ipport.Substring(0, ipport.IndexOf(':'));
string port = ipport.Substring(ipport.IndexOf(':') + 1);
info.client = client;
info.networkStream = stream;
Thread hread = new Thread(DoRecieve);
hread.Name = "TCP_ADAPTER_SEND_THREAD";
hread.IsBackground = true;
info.hread = hread;
hread.Start(info);
Thread.Sleep(THREAD_TIME_SPAN);
}
catch (Exception ex)
{
System.Console.Write(ex.Message);
}
}
}
public void Send(byte[] buffer)
{
sendBuffers.Enqueue(buffer);
}
private void DoSend()
{
while (m_running)
{
if (m_networkStream == null)
{
Thread.Sleep(THREAD_TIME_SPAN);
continue;
}
if (!sendBuffers.IsEmpty)
{
byte[] buffer;
while (sendBuffers.TryDequeue(out buffer))
m_networkStream.Write(buffer, 0, buffer.Length);
}
Thread.Sleep(THREAD_TIME_SPAN);
}
}
private void DoRecieve(object tcpclientinfo)
{
TcpInfo info = tcpclientinfo as TcpInfo;
string ipport = info.client.Client.RemoteEndPoint.ToString();
string ip = ipport.Substring(0, ipport.IndexOf(':'));
string port = ipport.Substring(ipport.IndexOf(':') + 1);
while (m_running)
{
try
{
if (info == null || info.networkStream==null)
break;
if (info.networkStream.DataAvailable)
{
int length = info.networkStream.Read(recieveBuffer, 0, recieveBuffer.Length);
if (length == 0)
{
continue;
}
byte[] dataBuffer = new byte[length];
for (int i = 0; i < length; i++)
{
dataBuffer[i] = recieveBuffer[i];
}
RecieveData(dataBuffer, length, ip);
}
Thread.Sleep(THREAD_TIME_SPAN);
}
catch (Exception ex)
{
System.Console.Write(ex.Message);
break;
}
}
}
public void RecieveData(byte[] buffer, int dataLength,string ip)
{
//数据处理
}
public void Start()
{
if (m_init)
return;
m_tcplistener.Start();
m_init = true;
m_running = true;
m_recieveThread.Start();
}
public void Dispose()
{
m_running = false;
m_init = false;
if (m_tcplistener != null)
m_tcplistener.Stop();
}
}