class SocketHelper
    {
        public delegate void Uplistbox(string txt);
        public Uplistbox uplb;  //更新listbox委托变量
        protected static readonly ILog logger = LogManager.GetLogger(typeof(TCPSocketServer2));
        private ManualResetEvent allDone = new ManualResetEvent(false); //线程控制
        protected Hashtable m_workerSocketHt = Hashtable.Synchronized(new Hashtable());//保存客户端socket哈希表
        public AsyncCallback asyncCallBack;  //声明异步完成时调用的方法.
        private Socket m_mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//主通信Socket
        public bool isExit = false;//全局控制SOCKET启动和关闭
        private long m_clientCount = 0L;//记录客户端数量
        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="buffer">需要发送的字节</param>
        public void Send(byte[] buffer)
        {
            try
            {
                //目标地址
                IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234);
                //发送通信socket
                Socket sk = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                sk.Connect(ip);//连接
                sk.Send(buffer);//发送
                SocketUser su = new SocketUser();
                su.CurrentSocket = sk;
                su.DataBuffer = buffer;
                //异步接收
                asyncCallBack = new AsyncCallback(OnDataReceived);
                sk.BeginReceive(su.DataBuffer, 0, su.DataBuffer.Length, SocketFlags.None, asyncCallBack, su);
            }
            catch (Exception ex)
            {
                string msg = ex.ToString() + " " + DateTime.Now.ToString();
                uplb(msg);
                logger.Debug(msg);
            }
        }
        /// <summary>
        /// 发送消息[重载]
        /// </summary>
        /// <param name="SocketUser">需要发送的SocketUser对象</param>
        /// <param name="buffer">需要发送的字节</param>
        public void Send(SocketUser su, byte[] buffer)
        {
            try
            {
                //目标地址
                IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234);
                //发送通信socket
                su.CurrentSocket.Connect(ip);//连接
                su.CurrentSocket.Send(buffer);//发送
                su.DataBuffer = buffer;
                //异步接收
                asyncCallBack = new AsyncCallback(OnDataReceived);
                su.CurrentSocket.BeginReceive(su.DataBuffer, 0, su.DataBuffer.Length, SocketFlags.None, asyncCallBack, su);
            }
            catch (Exception ex)
            {
                string msg = ex.ToString() + " " + DateTime.Now.ToString();
                uplb(msg);
                logger.Debug(msg);
            }
        }
        /// <summary>
        /// 建立监听连接
        /// </summary>
        /// <param name="port">监听的端口号</param>
        private void AcceptConnection(object port)
        {
            try
            {
                IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, (int)port);
                //绑定地址
                m_mainSocket.Bind(ipLocal);
                //开始监听
                m_mainSocket.Listen(10000);
                while (isExit == false)
                {
                    try
                    {
                        allDone.Reset(); //线程阻塞
                        logger.Debug("TcpListener启动成功: " + ipLocal.Address.ToString() + "," + ipLocal.Port.ToString());
                        //接收异步连接并创建新的socket对象.
                        m_mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), m_mainSocket);
                        allDone.WaitOne();
                    }
                    catch (SocketException sf)
                    {
                        logger.Error("客户连接请求异常" + sf.ToString());
                    }
                    catch (Exception f)
                    {
                        logger.Error("客户连接请求异常" + "错误信息:" + f.Message);
                        break;
                    }
                }
            }
            catch (SocketException se)
            {
                logger.Error("TcpListener启动失败" + se.ToString() + "错误号:" + se.ErrorCode.ToString());
            }
            catch (Exception e)
            {
                logger.Error("TcpListener错误" + "错误信息:" + e.Message);
            }
        }
        /// <summary>
        /// 开始监听
        /// </summary>
        /// <param name="Port">监听的端口</param>
        /// <param name="buffer">发送的字节</param>
        public bool StartListening(int Port, params byte[] buffer)
        {
            if (Port == 0)
            {
                logger.Debug("TcpListener未启动,请指定监听的端口号.");
                return false;
            }
            // 创建监听socket
            Thread AcceptTh = new Thread(new ThreadStart(delegate
            {
                AcceptConnection(Port);
            }));
            AcceptTh.Start();
            Thread sendth = new Thread(new ThreadStart(delegate
            {
                Send(buffer);
            }));
            sendth.Start();
            logger.Debug("启动TCP监听,端口: " + Port);
            return true;
        }
      }
}

Socket 代码收藏的更多相关文章

  1. Netty实现的一个异步Socket代码

    本人写的一个使用Netty实现的一个异步Socket代码 package test.core.nio; import com.google.common.util.concurrent.ThreadF ...

  2. 代码收藏系列--php--生成简短唯一订单号(转载)

    代码收藏系列--php--生成简短唯一订单号 /** * 生成商家交易单号 * <br />特点:不重复 * <br />示例: * <br />普通付款:arra ...

  3. 代码收藏系列--php--生成简短唯一订单号

    /** * 生成商家交易单号 * <br />特点:不重复 * <br />示例: * <br />普通付款:array('shop_id'=>1,'prod ...

  4. SSL握手通信详解及linux下c/c++ SSL Socket代码举例

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例 摘自:http://www.169it.com/article/3215130236.html   分享到:8     发布时 ...

  5. SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...

  6. 代码收藏系列--jquery--筛选器、事件绑定技巧

    Jquery筛选器的一些常用技巧,比如过滤属性等 /* 过滤获取没有含data-xsui-grid-colspan的节点 */$(this).find('.xsui-grid-cell:not([da ...

  7. 代码收藏系列--javascript--日期函数

    /** * 获取当前时间的简短函数 * @returns {String} * @@example getTimeStamp() 结果是:2017-07-12 09:21:30 */ function ...

  8. 代码收藏系列--javascript--移动端技巧

    JS判断是否是手机端访问: var is_mobi = navigator.userAgent.toLowerCase().match(/(ipod|iphone|android|coolpad|mm ...

  9. 代码收藏系列--mysql--创建数据库、数据表、函数、存储过程命令

    创建mysql数据库 CREATE DATABASE IF NOT EXISTS `database_name` DEFAULT CHARSET utf8 COLLATE utf8_general_c ...

随机推荐

  1. HDU 6162 树链剖分

    题意:给你一颗树,每个节点有有一个权值,每次询问从x到y的最短路上权值在c到d之间的所有的点的权值和是多少. 思路:肯定要用树剖,因为询问c到d之间这种操作树上倍增很难做,但是用其它数据结构可以比较好 ...

  2. CentOS7下安装pip和pip3

    1.首先检查linux有没有安装python-pip包,直接执行 yum install python-pip 2.没有python-pip包就执行命令 yum -y install epel-rel ...

  3. 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

    1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器, ...

  4. python2 and python3 difference - division

    1. python2 2. python3 3.from python environment import py3 features

  5. java开发中用到的技术(持续更新.....)

    一.数据库 1.数据库连接池:当jdbc连接数据库使用DriverManager 获取时,每次向数据库建立连接的时候都要讲connection加载到内存中,当同时使用的用户数量较大时,会造成服务器不堪 ...

  6. EZOJ #77

    传送门 分析 一个比较神奇的思路 我们考虑分治,对于每一个区间[le,ri]我们计算这个区间中左端点属于[le,mid],右端点属于[mid+1,ri]的情况对答案的贡献 我们求左半个区间的最大最小值 ...

  7. HTML 4.0 触发事件

    HTML 4 的新特性之一是可以使 HTML 事件触发浏览器中的行为,比方说当用户点击某个 HTML 元素时启动一段 JavaScript. 在现代浏览器中都内置有大量的事件处理器.这些处理器会监视特 ...

  8. appium自动化安装(二)

    第二节  安装Android开发环境 如果你的环境是MAC那么可以直接跳过这一节.就像我们在用Selenium进行web自动化测试的时候一样,我们需要一个浏览器来执行测试脚本.那么移动端自动化测试,我 ...

  9. C++工程实践 一个开始

    打算把C++工程过程中的一些总结写下来.从打算写这个内容到今天(2017/1/12)已经很多年了,但是一直没有想好如何写,反正就这样,有什么写什么吧. C++工程实践之所以难产,主要原因有几个 内容比 ...

  10. css 隐藏html元素的方法

    1.常见方法 display:none 这个方法的问题是 元素被隐藏了 同时该元素不占位置了,应该也可以说该元素没有高度和宽度了 2.常见方法 visibility: hidden; 这个方法和dis ...