采用网络对联方式交互数据
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

227 lines
7.8 KiB

using AKSWebBrowser.Commen;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Net;
using System.Net.Http;
using System.IO.Ports;
using System.Timers;
using AksWebBrowser;
namespace AksWebBrowser.Common
{
public class TcpClients
{
public string jsonstr = string.Empty;
/// <summary>
/// 打开连接
/// </summary>
public TcpClients()
{
try
{
//初始化连接 192.168.1.166
Parame.tcpClient = new TcpClient(Parame.Ip, 1234);
NetworkStream stream = Parame.tcpClient.GetStream();
Task.Factory.StartNew(() => { Write(stream); });
ThreadPool.QueueUserWorkItem(SendInstruction, Parame.tcpClient);
}
catch { Parame.tcpClient = null; }
finally
{
//开启定时
System.Timers.Timer timer = new System.Timers.Timer(1000);//3秒钟的时间间隔
timer.Elapsed += OnTimedEvent;
timer.AutoReset = true;//重复执行
timer.Enabled = true;//启动定时器
}
}
//打开串口
private void OnTimedEvent(Object source, ElapsedEventArgs e)
{
try
{
if (Parame.tcpClient == null)
{
Parame.tcpClient = new TcpClient(Parame.Ip, 1234);
NetworkStream stream = Parame.tcpClient.GetStream();
Task.Factory.StartNew(() => { Write(stream); });
ThreadPool.QueueUserWorkItem(SendInstruction, Parame.tcpClient);
}
}
catch { Parame.tcpClient = null; }
finally { }
}
/// <summary>
/// 读取服务端信息
/// </summary>
/// <param name="stream"></param>
public void Write(NetworkStream stream)
{
while (true)
{
try
{
// 读取包头,获取消息的大小
int messageSize = ReadHeader(stream);
if (messageSize == -1)
{
Parame.tcpClient = null;
//Console.WriteLine("与服务端连接断开");
break;
}
// 读取消息内容
byte[] buffer = new byte[messageSize];
int bytesRead = ReadExactly(stream, buffer, 0, messageSize);
if (bytesRead < messageSize)
{
Parame.tcpClient = null;
//Console.WriteLine("无法读取消息,可能是连接断开");
break;
}
string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
if (!message.Contains("heartbeatService"))
{
//接收到服务端口返回数据
//Console.WriteLine("接收到服务端口返回数据:{0}", message);
jsonstr = message;
}
else
{
//收到服务器心跳反馈
//Console.WriteLine("收到服务器心跳反馈:{0}", message);
SendDataWithHeader(stream, "heartbeatClient");
}
}
catch { jsonstr = string.Empty; Parame.tcpClient = null; }
finally { }
}
}
/// <summary>
/// 发送信息给服务端
/// </summary>
/// <param name="stream"></param>
/// <param name="message"></param>
public string SendDataWithHeader(NetworkStream stream, string message)
{
try
{
int timeout = 0;
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
byte[] header = BitConverter.GetBytes(messageBytes.Length);
byte[] data = new byte[header.Length + messageBytes.Length];
Array.Copy(header, 0, data, 0, header.Length);
Array.Copy(messageBytes, 0, data, header.Length, messageBytes.Length);
stream.Write(data, 0, data.Length);
jsonstr = string.Empty;
while (string.IsNullOrEmpty(jsonstr) && Parame.tcpClient != null)
{
Task.Delay(10).Wait();
timeout = timeout + 10;
if (timeout > 9000)
{
jsonstr = MainModel.str2Base64("{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "获取数据超时!" + "\"}");
}
}
if (string.IsNullOrEmpty(jsonstr))
{
jsonstr = MainModel.str2Base64("{\"message\":\"fali\",\"code\":\"400\",\"status\":false,\"data\":\"" + "硬件服务器未启动" + "\"}");
}
}
catch { Parame.tcpClient = null; }
finally { }
return jsonstr;
}
/// <summary>
/// 发送心跳
/// </summary>
/// <param name="state"></param>
public void SendInstruction(object state)
{
try
{
TcpClient client = (TcpClient)state;
NetworkStream stream = client.GetStream();
while (true)
{
// 每隔2分钟向服务端发送一条指令
Thread.Sleep(122000);
SendDataWithHeader(stream, "keepAlive");
//Console.WriteLine("发送心跳指令关闭连接");
}
}
catch { Parame.tcpClient = null; }
finally { }
}
/// <summary>
/// 解析包头中有多少字节
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
public int ReadHeader(NetworkStream stream)
{
try
{
byte[] header = new byte[4];
int headerBytesRead = stream.Read(header, 0, 4);
if (headerBytesRead < 4)
{
Parame.tcpClient = null;
//Console.WriteLine("无法读取包头,可能是连接断开");
return -1;
}
return BitConverter.ToInt32(header, 0);
}
catch
{
Parame.tcpClient = null;
return -1;
}
}
/// <summary>
/// 等待流全部获取到,然后丢出去
/// </summary>
/// <param name="stream"></param>
/// <param name="buffer"></param>
/// <param name="offset"></param>
/// <param name="count"></param>
/// <returns></returns>
public int ReadExactly(NetworkStream stream, byte[] buffer, int offset, int count)
{
try
{
int bytesRead = 0;
while (bytesRead < count)
{
int result = stream.Read(buffer, offset + bytesRead, count - bytesRead);
if (result == 0)
{
// 连接断开或遇到流的末尾
return bytesRead;
}
bytesRead += result;
}
return bytesRead;
}
catch
{
Parame.tcpClient = null;
return -1;
}
}
}
}