using HIBase.Library.Helper;
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
public class TcpReceiver
{
private TcpListener _listener;
private bool _isRunning;
private const int PORT = 2001;//自行指定
// 启动监听(外部调用)
public void Start()
{
if (_isRunning) return;
_isRunning = true;
new Thread(ListenThread) { IsBackground = true }.Start();
}
// 监听线程
private void ListenThread()
{
try
{
_listener = new TcpListener(IPAddress.Any, PORT);//自行制定
_listener.Start();
while (_isRunning)
{
// 等待客户端连接
if (_listener.Pending())
{
TcpClient client = _listener.AcceptTcpClient();
// 每次来新连接,都开独立线程接收
new Thread(() => ReceiveClient(client))
{
IsBackground = true
}.Start();
}
Thread.Sleep(10);
}
}
catch
{
Thread.Sleep(1000);
if (_isRunning) ListenThread();
}
}
// 处理一个客户端连接(支持持续收发)
private void ReceiveClient(TcpClient client)
{
byte[] buffer = new byte[1024 * 8];
try
{
using (NetworkStream stream = client.GetStream())
{
while (_isRunning && client.Connected)
{
if (stream.DataAvailable)
{
int len = stream.Read(buffer, 0, buffer.Length);
if (len <= 0) break;
byte[] data = new byte[len];
Array.Copy(buffer, data, len);
// 持续处理数据
ProcessReceivedData(data);
}
Thread.Sleep(10);
}
}
}
catch
{
}
finally
{
try { client.Close(); } catch { }
}
}
private void ProcessReceivedData(byte[] data)
{
try
{
//业务处理逻辑
}
catch { }
}
// 停止
public void Stop()
{
_isRunning = false;
try { _listener.Stop(); } catch { }
}
}