using System; using System.Collections.Generic; using System.Linq; using System.Net.Sockets; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; using static NTADCP.Sockets; namespace NTADCP { public class Client : SocketObject { public PushSockets pushSockets; bool IsClose = false; /// /// 当前管理对象 /// 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); } catch (Exception) { return false; } 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); return true; } /// /// 读取 /// private void EndReader(IAsyncResult ir) { Sockets s = ir.AsyncState as Sockets; try { if (s != null) { if (IsClose && client == null) { sk.nStream.Close(); sk.nStream.Dispose(); return; } s.Offset = s.nStream.EndRead(ir); if (pushSockets != null) pushSockets.Invoke(s);//推送至UI sk.nStream.BeginRead(sk.RecBuffer, 0, sk.RecBuffer.Length, new AsyncCallback(EndReader), sk); } } 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(); IsClose = true; 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.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); } } }