杨前锦
2025-06-13 b7308bba3d7ffad271ce7fc7a93c8c45d76be87d
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/device/TcpServer.cs
New file
@@ -0,0 +1,142 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
namespace HH.WCS.Mobox3.FJJT.device
{
    public class TcpServer
    {
        public TcpServer(string ip) {
            Init(ip);
        }
        private void Init(string ip) {
            //创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try {
                //将该socket绑定到主机上面的某个端口,端口应该放到配置文件中
                socket.Bind(new IPEndPoint(IPAddress.Parse(ip), 2023));
                Console.WriteLine(2023);
                //启动监听,并且设置一个最大的队列长度
                socket.Listen(30);
                //开始接受客户端连接请求
                socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
            }
            catch (Exception e) {
                Console.WriteLine(e.Message);
            }
        }
        public static Dictionary<string, Socket> clients = new Dictionary<string, Socket>();
        public static Dictionary<string, byte[]> buffers = new Dictionary<string, byte[]>();
        public static void ClientAccepted(IAsyncResult ar) {
            var socket = ar.AsyncState as Socket;
            var client = socket.EndAccept(ar);
            string remote_ip = ((System.Net.IPEndPoint)client.RemoteEndPoint).Address.ToString();
            if (clients.Keys.Contains(remote_ip)) {
                clients[remote_ip] = client;
            }
            else {
                clients.Add(remote_ip, client);
            }
            if (!buffers.Keys.Contains(remote_ip)) {
                buffers.Add(remote_ip, new byte[1024]);
            }
            //给客户端发送一个欢迎消息
            //client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at " + DateTime.Now.ToString()));
            Console.WriteLine(remote_ip);
            try {
                client.BeginReceive(buffers[remote_ip], 0, buffers[remote_ip].Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
            }
            catch (Exception ex) {
                Console.WriteLine($"【接收客户端的消息异常】:" + ex.Message);
            }
            //准备接受下一个客户端请求
            socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
        }
        public static void ReceiveMessage(IAsyncResult ar) {
            try {
                var socket = ar.AsyncState as Socket;
                string remote_ip = ((System.Net.IPEndPoint)socket.RemoteEndPoint).Address.ToString();
                var length = socket.EndReceive(ar);
                if (length == 0) {
                    clients.Remove(remote_ip);
                    buffers.Remove(remote_ip);
                    return;
                }
                else {
                    if (!clients.Keys.Contains(remote_ip)) {
                        clients.Add(remote_ip, socket);
                    }
                    if (!buffers.Keys.Contains(remote_ip)) {
                        buffers.Add(remote_ip, new byte[1024]);
                    }
                }
                try {
                    if (buffers.Keys.Contains(remote_ip)) {
                        //读取出来消息内容
                        var message = GetHexString(buffers[remote_ip], length);//16   10
                        Console.WriteLine(message);
                        if ( message.Length == 24 && message.Substring(0, 16) == "0000710200101400" ) {
                            //显示消息
                            string msg = message.Substring(16,8);
                            PlcHelper.Receive(remote_ip, msg);
                            Array.Clear(buffers[remote_ip], 0, buffers[remote_ip].Length);//清空当前IP Buffer
                        }
                        else {
                            LogHelper.Info($"【TCP信息协议异常】:IP:{remote_ip},MSG:{message}", "TCP");
                        }
                    }
                    else {
                        if (!buffers.Keys.Contains(remote_ip)) {
                            buffers.Add(remote_ip, new byte[1024]);
                        }
                    }
                }
                catch (Exception ex) {
                    Console.WriteLine($"【处理客户端的消息异常】:" + ex.Message);
                }
                //接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)
                socket.BeginReceive(buffers[remote_ip], 0, buffers[remote_ip].Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
            }
            catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
        }
        private static string GetHexString(byte[] buffer, int lenght) {
            return BitConverter.ToString(buffer, 0, lenght).Replace("-", string.Empty).ToLower();
        }
        public static bool TcpServerSend(string ip, byte[] msg) {
            if (clients.Keys.Contains(ip)) {
                var client = clients[ip];
                if (client.Connected) {
                    try {
                        client.Send(msg);
                        return true;
                    }
                    catch (SocketException ex) {
                        Console.WriteLine(ex.Message);
                        clients[ip].Close();
                        clients.Remove(ip);
                    }
                }
                else {
                    clients[ip].Close();
                    clients.Remove(ip);
                }
            }
            else {
                Console.WriteLine("未找到设备的链接:" + ip);
            }
            return false;
        }
    }
}