From b7308bba3d7ffad271ce7fc7a93c8c45d76be87d Mon Sep 17 00:00:00 2001 From: 杨前锦 <1010338399@qq.com> Date: 星期五, 13 六月 2025 17:21:03 +0800 Subject: [PATCH] 优化印尼佳通-硫化胚胎出入库逻辑策略优化 --- HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/device/TcpServer.cs | 142 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 142 insertions(+), 0 deletions(-) diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/device/TcpServer.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/device/TcpServer.cs new file mode 100644 index 0000000..833cbe1 --- /dev/null +++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/device/TcpServer.cs @@ -0,0 +1,142 @@ +锘縰sing 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鐨凷tream Socket锛堟祦寮忓鎺ュ瓧锛�+ var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + try { + //灏嗚socket缁戝畾鍒颁富鏈轰笂闈㈢殑鏌愪釜绔彛锛岀鍙e簲璇ユ斁鍒伴厤缃枃浠朵腑 + 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($"銆怲CP淇℃伅鍗忚寮傚父銆戯細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; + + } + + } +} -- Gitblit v1.9.1