C# Socket 监听程序:IllusiveServer

1 篇文章 0 订阅

需求:因为项目由十多个子程序组成,通过socket互相链接访问。

但是日常开发测试中有一半系统不是必须的,全部启动嘛,机子又太卡。但不启动嘛,主程序连不上他们时,又老是在报错。

所以搞了一个虚假的服务器。这个IllusiveServer只需要监听指定端口并建立连接,就什么都不做了,大大减少我机子压力。

整个由4个函数组成,非常简单,可以作为C# Socket 监听的入门例子学习。

效果如下图:


上代码:

using System;
using System.Configuration;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;   //这个和上面的是使用Socket必须的.


namespace IllusiveServer
{
    class Program
    {
        /// <summary>
        /// 接受处理线程
        /// </summary>
        /// <param name="conn"></param>
        static void ConnectThead(Socket conn)
        {
            byte[] buffer = new byte[1024 * 8];
            Console.WriteLine(String.Format("{0}: receive connect: {1}", conn.LocalEndPoint.ToString(), conn.RemoteEndPoint.ToString()));
            try
            {
                // 一直接收数据,直到结束
                while (true)
                {
                    int n = conn.Receive(buffer);
                    if (n == 0)
                    {
                        Console.WriteLine(String.Format("{0}: close connect {1}", conn.LocalEndPoint.ToString(), conn.RemoteEndPoint.ToString()));
                        return;
                    }
                    else
                    {
                        Console.WriteLine(String.Format("{0}: receive {1}  {2} bytes.", conn.LocalEndPoint.ToString(), conn.RemoteEndPoint.ToString(), n));
                    }
                }
            }
            catch (SocketException ex)
            {
                Console.WriteLine(String.Format("{0}: socket error: {1} {2}", conn.LocalEndPoint.ToString(), conn.RemoteEndPoint.ToString(), ex.Message));
            }
        }

        /// <summary>
        /// 异步连接处理
        /// </summary>
        /// <param name="ar"></param>
        static void onAccept(IAsyncResult ar)
        {
            Socket listener = (Socket)ar.AsyncState;
            Socket conn = listener.EndAccept(ar);
            // 重新开始监听
            listener.BeginAccept(onAccept, listener);

            // 启动连接处理
            Task.Factory.StartNew(() => { ConnectThead(conn); });
        }

        /// <summary>
        /// 创建监听列表
        /// </summary>
        /// <param name="port"></param>
        /// <returns></returns>
        static Socket createListener(int port)
        {
            try
            {
                Console.WriteLine(String.Format("start listen port: {0}", port));
                IPAddress[] adds = Dns.GetHostAddresses("127.0.0.1");

                //本地终结点
                IPEndPoint iep = new IPEndPoint(adds[0], port);    

                //实例化内成员sock
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                // 绑定
                socket.Bind(iep);

                // 设置为监听状态
                socket.Listen(10);

                // 启动异步连接处理
                socket.BeginAccept(onAccept, socket);
                return socket;
            }
            catch (Exception ex)
            {
                Console.WriteLine(String.Format("start listen port: {0} error.\r\n{1}", port, ex.Message));
                return null;
            }
        }


        static void Main(string[] args)
        {
            // Thread signal.
            ManualResetEvent allDone = new ManualResetEvent(false);
            allDone.Reset();

            // 从配置读入监听端口列表,用半角逗号分割
            string listened = ConfigurationManager.AppSettings["listened"];
            foreach (string port in listened.Split(','))
            {
                createListener(Convert.ToInt32(port));
            }

            // 死等,等 ctrl+C 才结束
            allDone.WaitOne();
        }
    }
}

app.config如下

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="listened" value="7201, 7202, 7204, 7205, 7206, 7208, 7214"/>
  </appSettings>
</configuration>


项目下载地址:http://download.csdn.net/detail/greenery/6683127


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值