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);
}
}
}