Files
DevToolsAvalonia/常用工具集/Utility/Network/TCPUtils.cs
2025-08-26 08:37:44 +08:00

174 lines
4.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace .Utility.Network
{
public class TCPUtils
{
private TcpClient tcpClient;
private string ipAddress = "127.0.0.1";
private int port = 502;
private int connectTimeout = 1000;
private bool connected = false;
private NetworkStream stream;
/// <summary>
/// 判断是否已经连接
/// </summary>
public bool Connected
{
get
{
if (tcpClient == null)
{
return false;
}
return connected;
}
}
public string IPAddress
{
get
{
return ipAddress;
}
set
{
ipAddress = value;
}
}
public int Port
{
get
{
return port;
}
set
{
port = value;
}
}
public int ConnectionTimeout
{
get
{
return connectTimeout;
}
set
{
connectTimeout = value;
}
}
public TCPUtils() { }
public TCPUtils(string ipAddress, int port)
{
this.ipAddress = ipAddress;
this.port = port;
}
public TCPUtils(string ipAddress, int port,int timeout)
{
this.ipAddress = ipAddress;
this.port = port;
this.ConnectionTimeout = timeout;
}
public void Connect()
{
tcpClient = new TcpClient();
IAsyncResult asyncResult = tcpClient.BeginConnect(ipAddress, port, null, null);
if (!asyncResult.AsyncWaitHandle.WaitOne(connectTimeout))
{
throw new Exception("connection timed out");
}
tcpClient.EndConnect(asyncResult);
stream = tcpClient.GetStream();
stream.ReadTimeout = connectTimeout;
connected = true;
}
public void Connect(string ipAddress, int port)
{
tcpClient = new TcpClient();
IAsyncResult asyncResult = tcpClient.BeginConnect(ipAddress, port, null, null);
if (!asyncResult.AsyncWaitHandle.WaitOne(connectTimeout))
{
throw new Exception("connection timed out");
}
tcpClient.EndConnect(asyncResult);
stream = tcpClient.GetStream();
stream.ReadTimeout = connectTimeout;
connected = true;
}
public byte[] Send(byte[] sendData)
{
if (tcpClient == null)
{
throw new Exception("connection error");
}
if (!tcpClient.Client.Connected)
{
throw new Exception("connection error");
}
//连接成功
stream.Write(sendData, 0, sendData.Length);
byte[] revData = new byte[512];
int num = stream.Read(revData, 0, revData.Length);
return revData.Take(num).ToArray();
}
public void Disconnect()
{
if (stream != null)
{
stream.Close();
}
if (tcpClient != null)
{
tcpClient.Close();
}
connected = false;
}
~TCPUtils()
{
if (tcpClient != null)
{
if (stream != null)
{
stream.Close();
}
tcpClient.Close();
}
}
public bool Available(int timeout)
{
Ping ping = new Ping();
IPAddress address = System.Net.IPAddress.Parse(ipAddress);
string s = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
byte[] bytes = Encoding.ASCII.GetBytes(s);
PingReply pingReply = ping.Send(address, timeout, bytes);
if (pingReply.Status == IPStatus.Success)
{
return true;
}
return false;
}
}
}