| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 | using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net;using System.Net.Sockets;using System.Threading;using Aitex.Core.RT.Event;using Aitex.Core.RT.Log;using MECF.Framework.Common.Equipment;namespace MECF.Framework.Common.Communications{    public class AsynSocketServer : IDisposable    {        public delegate void ErrorHandler(string args);        public event ErrorHandler OnErrorHappened;        public delegate void MessageHandler(string message);        public event MessageHandler OnDataChanged;        public delegate void BinaryMessageHandler(byte[] message);        public event BinaryMessageHandler OnBinaryDataChanged;        private static Object _locker = new Object();        public string NewLine { get; set; }        public bool NeedLog { get; set; } = true;        private string _ip;        private int _port;        private bool _isAscii;        private static int _bufferSize = 1021;        private ProtocolType _protocolType;        public bool IsConnected { get { return (_serverSocket != null /*&& _serverSocket.Connected*/); }  }        public AsynSocketServer(string ip, int port, bool isAscii,string newline = "\r", ProtocolType protocolType = ProtocolType.Tcp)        {            _ip = ip;            _port = port;            _isAscii = isAscii;            _serverSocket = null;            NewLine = newline;            _protocolType = protocolType;        }        ~AsynSocketServer()        {            Dispose();        }        Socket _clientSocket;        Socket _serverSocket;        public void Start()        {            if (_serverSocket != null)                return;            //创建套接字            IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(_ip), _port);            _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, _protocolType);            //绑定端口和IP            _serverSocket.Bind(ipe);            //设置监听            _serverSocket.Listen(10);            //连接客户端            AsyncAccept(_serverSocket);        }        /// <summary>        /// 连接到客户端        /// </summary>        /// <param name="serverSocket"></param>        private void AsyncAccept(Socket serverSocket)        {            serverSocket.BeginAccept(asyncResult =>            {                //获取客户端套接字                _clientSocket = serverSocket.EndAccept(asyncResult);                LOG.Info(string.Format("Received client {0} connect request", _clientSocket.RemoteEndPoint));                AsyncReveive();            }, null);        }        byte[] _buffer;        /// <summary>        /// 接收消息        /// </summary>        /// <param name="client"></param>        private void AsyncReveive()        {            _buffer = new byte[_bufferSize];            try            {                //开始接收消息                _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);            }            catch (Exception ex)            {                LOG.Write(ex);                string reason = string.Format("TCP Socket recevice data failed:{0}", ex.Message);                LOG.Error(string.Format("Communication  {0}:{1:D} {2}.", _ip, _port, reason));                OnErrorHappened(reason);            }        }        private void ReceiveCallback(IAsyncResult asyncResult)        {            int length = _clientSocket.EndReceive(asyncResult);            if(length > 0)            {                if (_isAscii)                {                    string message = Encoding.ASCII.GetString(_buffer, 0, length);                    if (NeedLog)                        LOG.Info(string.Format("Client message:{0}", message));                    OnDataChanged(message);                }                else                {                    byte[] recvBuff = new byte[length];                    for (int i = 0; i < length; i++)                    {                        recvBuff[i] = _buffer[i];                    }                    if(NeedLog)                                           LOG.Info($"Client message: {string.Join(" ", recvBuff)}.");                    OnBinaryDataChanged(recvBuff);                }            }            else            {                //client disconnect, will....            }            //清空数据,重新开始异步接收            _buffer = new byte[_bufferSize];            _clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), _clientSocket);        }        /// <summary>        /// 发送消息        /// </summary>        /// <param name="_clientSocket"></param>        /// <param name="sendMessage"></param>        public void Write(string sendMessage)        {            if (_clientSocket == null || sendMessage == string.Empty) return;            //数据转码            byte[] data = new byte[1024];            data = Encoding.ASCII.GetBytes(sendMessage);            try            {                //开始发送消息                _clientSocket.BeginSend(data, 0, data.Length, SocketFlags.None, asyncResult =>                {                    //完成消息发送                    int length = _clientSocket.EndSend(asyncResult);                    //输出消息                    if (NeedLog)                        LOG.Info(string.Format("Communication {0}:{1:D} Send {2}.", _ip, _port, data));                }, null);            }            catch (Exception e)            {                LOG.Write(e);                string reason = string.Format("TCP连接发生错误:{0}", e.Message);                LOG.Error(string.Format("Communication  {0}:{1:D} {2}.", _ip, _port, reason));                OnErrorHappened(reason);            }        }        public void Write(byte[] data)        {            if (_clientSocket == null || data.Count() == 0) return;            try            {                //开始发送消息                _clientSocket.BeginSend(data, 0, data.Length, SocketFlags.None, asyncResult =>                {                    //完成消息发送                    int length = _clientSocket.EndSend(asyncResult);                    //输出消息                    if (NeedLog)                        LOG.Info(string.Format("Communication {0}:{1:D} Send {2}.", _ip, _port, data));                }, null);            }            catch (Exception e)            {                LOG.Write(e);                string reason = string.Format("TCP连接发生错误:{0}", e.Message);                LOG.Error(string.Format("Communication  {0}:{1:D} {2}.", _ip, _port, reason));                OnErrorHappened(reason);            }        }        /// </summary>        public void Dispose()        {            try            {                if (_serverSocket != null)                {                    if (IsConnected)                    {                        _serverSocket.Shutdown(SocketShutdown.Both);                    }                    _serverSocket.Close();                    _serverSocket.Dispose();                    _serverSocket = null;                }            }            catch (Exception ex)            {                LOG.Write(ex);                string reason = string.Format("释放socket资源失败:{0}", ex.Message);                OnErrorHappened(reason);            }        }    }}
 |