using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Net; using System.Text; using System.Threading.Tasks; using static DeerProject.Common.Sockets; namespace DeerProject.Common { public class Clinet : SocketObject { public PushSockets pushSockets; /// /// 当前管理对象 /// Sockets sk; /// /// 客户端 /// TcpClient client; /// /// 当前连接服务端地址 /// IPAddress Ipaddress; /// /// 当前连接服务端端口号 /// int Port; /// /// 服务端IP+端口 /// IPEndPoint ip; /// /// 发送与接收使用的流 /// NetworkStream nStream; /// /// 初始化Socket /// /// /// public override void InitSocket(IPAddress ipaddress, int port) { Ipaddress = ipaddress; Port = port; ip = new IPEndPoint(Ipaddress, Port); client = new TcpClient(); } /// /// 初始化Socket /// /// ipd地址 /// 端口 public override void InitSocket(string ipaddress, int port) { Ipaddress = IPAddress.Parse(ipaddress); Port = port; ip = new IPEndPoint(Ipaddress, Port); client = new TcpClient(); } /// /// 重写Start方法,其实就是连接服务端 /// public override void Start() { Connect(); } /// /// 连接 /// public bool Connect() { try { client.Connect(ip); nStream = new NetworkStream(client.Client, true); sk = new Sockets(ip, client, nStream); sk.nStream.BeginRead(sk.RecBuffer, 0, sk.RecBuffer.Length, new AsyncCallback(EndReader), sk); } catch (Exception) { return false; } return true; } /// /// 读取 /// private void EndReader(IAsyncResult ir) { Sockets s = ir.AsyncState as Sockets; try { if (s != null) { if (client == null) { sk.nStream.Close(); sk.nStream.Dispose(); return; } s.Offset = s.nStream.EndRead(ir); if (pushSockets != null) pushSockets.Invoke(s);//推送至UI if (IsOnline()) { //Thread.Sleep(100); sk.nStream.BeginRead(sk.RecBuffer, 0, sk.RecBuffer.Length, new AsyncCallback(EndReader), sk); } else { if (Ipaddress.ToString().Equals(tools.GetAppSetting("PLC_IP1"))) { //MainWindow.mainViewModel.DoSocket1Connect("断开"); tools.Logging("站点1目前系统由于卫通/下位机原因链接断开,IP:" + Ipaddress + "端口号:" + Port); //DoConnect(1); } else if (Ipaddress.ToString().Equals(tools.GetAppSetting("PLC_IP2"))) { //MainWindow.mainViewModel.DoSocket2Connect("断开"); tools.Logging("站点2目前系统由于卫通/下位机原因链接断开,IP:" + Ipaddress + "端口号:" + Port); //DoConnect(2); } } } } catch (Exception skex) { Sockets sks = s; sks.ex = skex; sks.ClientDispose = true; if (pushSockets != null) pushSockets.Invoke(sks);//推送至UI } } /// /// 停止 /// public override void Stop() { Sockets sks = new Sockets(); try { if (client != null) { client.Client.Shutdown(SocketShutdown.Both); Thread.Sleep(10); client.Close(); client = null; } else { sks.ex = new Exception("客户端没有初始化.!"); } if (pushSockets != null) pushSockets.Invoke(sks);//推送至UI } catch (Exception ex) { sks.ex = ex; } } /// /// 发送消息 /// public void SendData(byte[] SendData) { try { if (client == null || !client.Connected) { Sockets sks = new Sockets(); sks.ex = new Exception("客户端无连接.."); sks.ClientDispose = true; if (pushSockets != null) pushSockets.Invoke(sks);//推送至UI } if (client != null && client.Connected) //如果连接则发送 { if (nStream == null) { nStream = client.GetStream(); } nStream.Write(SendData, 0, SendData.Length); } } catch (Exception skex) { Sockets sks = new Sockets(); sks.ex = skex; sks.ClientDispose = true; if (pushSockets != null) pushSockets.Invoke(sks);//推送至UI } } public bool Is_Connected() { return client.Connected; } public bool IsOnline() { if (client == null) return false; return !((client.Client.Poll(1000, SelectMode.SelectRead) && (client.Client.Available == 0)) || !client.Client.Connected); } } }