using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using Models;
using System.Threading;
namespace MountingRobot.BLL
{
/// <summary>
/// 机器人TCP通信
/// </summary>
public class RobotTcp
{
#region 私有字段
/// <summary>
/// Socket 对象
/// </summary>
private static Socket socketClient;
/// <summary>
/// 监听服务线程
/// </summary>
private static Task CheckReceiveMsgTask;
/// <summary>
/// 监听服务线程开关
/// </summary>
private static bool CheckReceiveMsgTaskSwitch = false;
#endregion
#region 公有字段
/// <summary>
/// 是否连接
/// </summary>
public static bool m_IsConnect = false;
/// <summary>
/// 消息
/// </summary>
public static string m_Msg = "";
#endregion
/// <summary>
/// 连接服务
/// </summary>
public static bool ConnectService(string ipAddress)
{
//【1】调用 socket() 函数创建一个用于通信的套接字
socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//【2】通过设置套接字地址结构,说明客户端与之通信的服务器的IP地址和端口号
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ipAddress), 10000);//端口号默认 10000
try
{
//【3】调用 connect() 函数来建立与服务器的连接
socketClient.Connect(ipe);
}
catch (Exception)
{
//服务器连接失败
m_IsConnect = false;
return false;
}
//创建一个监听的线程
CheckReceiveMsgTask = new Task(new Action(() => { CheckReceiveMsg(); }));
CheckReceiveMsgTaskSwitch = true;
CheckReceiveMsgTask.Start();
//服务器连接成功
m_IsConnect = true;
return true;
}
/// <summary>
/// 关闭连接
/// </summary>
public static void CloseConnect()
{
socketClient?.Close();//?:表示 socketClient 对象是否为空
m_IsConnect = false;
}
/// <summary>
/// 发送消息
/// </summary>
private static void SendMsg(string msg)
{
if (string.IsNullOrWhiteSpace(msg))
{
return;
}
byte[] send = Encoding.UTF8.GetBytes(msg);
socketClient?.Send(send);
}
/// <summary>
/// 监听服务器消息
/// </summary>
private static void CheckReceiveMsg()
{
while (CheckReceiveMsgTaskSwitch)
{
//创建一个缓冲区
byte[] buffer = new byte[1024 * 1024 * 10];
int lenght = -1;
try
{
//【4】调用读写函数发送或者接收数据
lenght = socketClient.Receive(buffer);
}
catch (Exception)
{
//服务器断开连接
m_IsConnect = false;
CheckReceiveMsgTaskSwitch = false;
break;
}
if (lenght > 0)
{
//数据处理
//string msg = Encoding.Default.GetString(buffer, 0, lenght);//解析不了汉字
string msg = Encoding.UTF8.GetString(buffer, 0, lenght);
DataParsing(msg);
}
else
{
//服务器断开连接?
m_IsConnect = false;
CheckReceiveMsgTaskSwitch = false;
break;
}
}
}
/// <summary>
/// 机器人 TCP 通信(数据解析)
/// </summary>
private static void DataParsing(string data)
{
m_Msg = data;
}
}
}