需求:因为项目由十多个子程序组成,通过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