Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Õë¶Ô¸ß²¢·¢£¬¿ÉÀ©Õ¹µÄ»¥ÁªÍø¼Ü¹¹£¬´î½¨ÏûÏ¢¶ÓÁÐ
 
  3067  次浏览      28
 2018-6-21
 
±à¼­ÍƼö:

±¾ÎÄÀ´×ÔÓÚÍøÂ磬ÎÄÕÂÏêϸ½éÉÜÁËĿǰÖ÷Á÷µÄÏûÏ¢¶ÓÁÐZeroMQ¼°»·¾³´î½¨µÄÏêϸ²½Ö裬ϣÍûÎÄÕµĽéÉÜ¿ÉÒÔÈôó¼ÒÓиöеÄÈÏʶ¡£

Ï뿪·¢¸ß²¢·¢¿ÉÀ©Õ¹µÄ»¥ÁªÍø¼Ü¹¹£¬ÏûÏ¢¶ÓÁÐÊDz»¿ÉȱÉٵģ¬Ä¿Ç°Ö÷Á÷µÄÏûÏ¢¶ÓÁУ¬ÓÐwindows×Ô´øµÄMSMQ£¬»¹ÓÐ¿çÆ½Ì¨µÄÇ¿´óµÄZeroMQ,ÕâÀïÎÒÃǾÍÑ¡ÓÃZeroMQ.

¡¡¡¡ZeroMQ½éÉÜ£º£¨Ò²Æ´Ð´×÷ ?MQ¡¢ 0MQ »ò ZMQ£© ÊǸö·Ç³£ÇáÁ¿¼¶µÄ¿ªÔ´ÏûÏ¢¶ÓÁÐÈí¼þ¡£ËüûÓжÀÁ¢µÄ·þÎñÆ÷£¬ÏûÏ¢Ö±½Ó´ÓÒ»¸öÓ¦ÓóÌÐò±»·¢Ë͵½ÁíÒ»¸öÓ¦ÓóÌÐò¡£ZeroMQµÄѧϰºÍÓ¦ÓÃÒ²·Ç³£¼òµ¥£¬ËüÖ»ÓÐÒ»¸ö C++ ±àд³ÉµÄµ¥¸ö¿âÎļþlibzmq.dll£¬ ¿ÉÒÔÁ´½Óµ½ÈκÎÓ¦ÓóÌÐòÖС£Èç¹ûÒªÔÚ.NET »·¾³ÖÐʹÓã¬ÎÒÃÇÐèÒªÓõ½Ò»¸öC#±àдµÄÃûΪ clrzmq.dll °ü×°¿â¡£ZeroMQ¿ÉÒÔÔÚ Windows¡¢ OS X ºÍ Linux µÈ¶àÖÖ²Ù×÷ϵͳÉÏÔËÐУ¬ C¡¢ C++¡¢C#¡¢ Java¡¢ Python µÈÓïÑÔ¶¼¿ÉÒÔ±àдZeroMQ Ó¦ÓóÌÐòÕâʹµÃ²»Í¬Æ½Ì¨ÉϵIJ»Í¬Ó¦ÓóÌÐòÖ®¼ä¿ÉÒÔÏ໥ͨѶ¡£

1¡¢»·¾³´î½¨£º

¡¡¡¡codeprojectרÌ⣬ÏÂÔØ¶ÔÓ¦µÄDownload binaries - 377.6 KB£¬½âѹËõµ½ÄãµÄÖ¸¶¨Â·¾¶¡£

¡¡¡¡ÕâÀïÎÒÃǾͲ»Ïêϸ½éÉÜ£¬Ö÷Ҫ˵һÏÂC#·â×°ºÃµÄ°æ±¾£¬NetMQ£¬ÊÇ»ùÓÚZeroMQ½øÐзâ×°µÄ¡£¾Í²»ÐèÒªÏÂÔØÁË£¬Ö±½ÓnugetÉÏ»ñÈ¡£º

¡¡¡¡PM> Install-Package NetMQ

¡¡¡¡ÎªÊ²Ã´²»Ö±½ÓÓÃZeroMQ£¬¶øÊ¹ÓÃNetMQ£¬ÔËÐзÇÍйܴúÂëµÄÍйÜÓ¦ÓóÌÐòÄÚ¿ÉÄÜ»á³öÏÖÐí¶àÏë²»µ½µÄÎÊÌ⣬ÏñÄÚ´æÐ¹Â©ºÍÆæ¹ÖµÄûÓзÃÎÊ´íÎó¡£¶øNetMQʹÓÃÔ­ÉúµÄC#ÓïÑÔ£¬Ëü¸üÈÝÒ×µ÷ÊÔÔ­ÉúC#´úÂ룬Äã¿ÉÒÔÏÂÔØ´úÂ룬µ÷ÊÔÄãµÄϵͳ¡£Äã¿ÉÒÔÔÚgithubÉϹ±Ïס£

¡¡¡¡´ý°²×°ºÃºó£¬ÏµÍ³»á×Ô¶¯Ìí¼ÓNetMQµÄÒýÓá£

¡¡¡¡¿ÉÒÔ¿´µ½£¬NetMQÊÇ»ùÓÚzmq½øÐпª·¢µÄ£¬Æäʵ¾ÍÊÇZeroMQÁË£¬²¢ÇÒÒѾ­ÎªÎÒÃÇ·â×°Á˸÷ÖÖ¹¦ÄܵÄMQ¶ÔÏ󣬱ÈÈçREP/REQ ,PUB/SUB(Ö÷Ìâʽ¶©ÔÄ),XPUB/XSUB£¨·ÇÖ÷Ìâ¶©ÔÄ£©£¬Push/Pull£¬ÉõÖÁ»¹ÓзÓÉģʽµÈ£¬´Ó×ÖÃæÒâÒåÉÏ£¬Ó¦¸ÃÄÜ¿´³ö¸ö´ó¸Å£¬ºóÃæÎÒÃÇÒ»¸öÒ»¸ö½øÐвâÊÔʹÓá£

¡¡¡¡ÏÈ¿´¸ö¼òµ¥µÄdemo£¬³õ²½Á˽âһϣº

class Program
{
static void Main(string[] args)
{
using (NetMQContext context = NetMQContext.Create())
{
Task serverTask = Task.Factory.StartNew(() =>Server(context));
Task clientTask = Task.Factory.StartNew(() => Client(context));
Task.WaitAll(serverTask, clientTask);
}
}

static void Server(NetMQContext context)
{
using (NetMQSocket serverSocket = context.CreateResponseSocket())
{
serverSocket.Bind("tcp://*:5555");

while (true)
{
string message = serverSocket.ReceiveString();

Console.WriteLine("Receive message {0}", message);

serverSocket.Send("World");

if (message == "exit")
{
break;
}
}
}
}

static void Client(NetMQContext context)
{
using (NetMQSocket clientSocket = context.CreateRequestSocket())
{
clientSocket.Connect("tcp://127.0.0.1:5555");

while (true)
{
Console.WriteLine("Please enter your message:");
string message = Console.ReadLine();
clientSocket.Send(message);

string answer = clientSocket.ReceiveString();

Console.WriteLine("Answer from server: {0}", answer);

if (message == "exit")
{
break;
}
}
}
}
}

¡¡¡¡´úÂë±È½Ï¼ò½àµÄ½éÉÜÁËREP/REQģʽÏÂNetMQµÄʹÓ㬶øÇÒÎÒÃÇ¿ÉÒÔ¿´µ½£¬Õâ¸öMq¶ÔÏóÊÇ¿ÉÒÔÔÚ²»Í¬µÄÏ̼߳äÇл»Ê¹Óõģ¬Ò²ÐíÄã»á²âÊÔÖÐÎÄ£¬ÄǾÍÏÈÐòÁл¯ÔÙ·´ÐòÁл¯°É£¬ÒòΪ¿ÉÄÜ»á³öÏÖÂÒÂëÓ´¡£

¡¡¡¡ÕâÀÎÒÏȼòµ¥¸ù¾ÝNetMQ,·â×°Ò»¸öServer¶ËºÍÒ»¸öClient¶Ë£¬·½±ãºóÃæÊ¹Ó㬵±È»Ò²¿ÉÒÔ²»·â×°£¬Ö±½ÓʹÓãº

¡¡¡¡Server£º

/// <summary>
/// Mq·þÎñ¶Ë
/// </summary>
public class OctMQServer : IDisposable
{
public event EventHandler<DataEventArgs<NetMQSocket, NetMQMessage>> OnReceive;
protected virtual void OnOnReceive(DataEventArgs<NetMQSocket, NetMQMessage> e)
{
EventHandler<DataEventArgs<NetMQSocket, NetMQMessage>> handler = OnReceive;
if (handler != null) handler(this, e);
}

private int _port;
private NetMQSocket _serverSocket;
private ServerType _type;
private NetMQContext _context;

public void Init(int port, ServerType type)
{
_type = type;
_port = port;
_context = NetMQContext.Create();
CreateServer();
}

void CreateServer()
{
switch (_type)
{
case ServerType.Response:
_serverSocket = _context.CreateResponseSocket(); break;
case ServerType.Pub:
_serverSocket = _context.CreatePushSocket(); break;
case ServerType.Router:
_serverSocket = _context.CreateRouterSocket(); break;
case ServerType.Stream:
_serverSocket = _context.CreateStreamSocket(); break;
case ServerType.Push:
_serverSocket = _context.CreatePushSocket(); break;
case ServerType.XPub:
_serverSocket = _context.CreateXPublisherSocket(); break;
default:
_serverSocket = _context.CreateResponseSocket(); break;
}
_serverSocket.Bind("tcp://*:" + _port);
Task.Factory.StartNew(() =>
AsyncRead(_serverSocket), TaskCreationOptions.LongRunning);
}

private void AsyncRead(NetMQSocket serverSocket)
{
while (true)
{
var msg = serverSocket.ReceiveMessage();
OnOnReceive(new DataEventArgs<NetMQSocket, NetMQMessage>(serverSocket, msg));
}
}


public NetMQSocket Server
{
get { return _serverSocket; }
}

public void Dispose()
{
_serverSocket.Dispose();
_context.Dispose();
}

public void Send(NetMQMessage msg)
{
_serverSocket.SendMessage(msg);
}

public NetMQMessage CreateMessage()
{
return new NetMQMessage();
}
}

¡¡¡¡ÕâÑù£¬Ê¹ÓÃÕ߾ͿÉÒÔ¸ù¾Ýö¾Ù½øÐзþÎñ¶ËµÄ´´½¨£¬ ²»ÓþÀ½áµ½µ×ÓÃÄÄÒ»ÖÖ·þÎñ¶Ë£¬²¢ÇÒ·â×°ÁËһЩÏûÏ¢µÄÒ첽ʼþ£¬·½±ãÔÚ¿ª·¢ÖÐʹÓ㬿ÉÒÔʹÓöಥίÍУ¬Õë¶Ô²»Í¬µÄÏûÏ¢½øÐв»Í¬µÄ´¦Àí£¬ÎÒÕâÀïʹÓõÄwhileÑ­»·£¬µ±È»£¬ÔÚnetmqÄÚ²¿ÌṩÁËÑ­»·Æ÷ºÍÐÄÌøµÈ£¬¶¼¿ÉÒÔÔÚʵ¼ÊµÄ¿ª·¢ÖнøÐÐÀ©Õ¹ºÍʹÓãºPollerºÍNetMQTimer¡£

¡¡¡¡Client£º

/// <summary>
/// MQ¿Í»§¶Ë
/// </summary>
public class OctMQClient:IDisposable
{
public event EventHandler<DataEventArgs<NetMQSocket, NetMQMessage>> OnReceive;
protected virtual void OnOnReceive(DataEventArgs<NetMQSocket, NetMQMessage> e)
{
EventHandler<DataEventArgs<NetMQSocket, NetMQMessage>> handler = OnReceive;
if (handler != null) handler(this, e);
}

private int _port;
private NetMQSocket _clientSocket;
private ClientType _type;
private NetMQContext _context;
private string _ip;
private Task task;
public void Init(string ip, int port, ClientType type)
{
_type = type;
_ip = ip;
_port = port;
_context = NetMQContext.Create();
CreateClient();
}

void CreateClient()
{
switch (_type)
{
case ClientType.Request:
_clientSocket = _context.CreateRequestSocket(); break;
case ClientType.Sub:
_clientSocket = _context.CreateSubscriberSocket(); break;
case ClientType.Dealer:
_clientSocket = _context.CreateDealerSocket(); break;
case ClientType.Stream:
_clientSocket = _context.CreateStreamSocket(); break;
case ClientType.Pull:
_clientSocket = _context.CreatePullSocket(); break;
case ClientType.XSub:
_clientSocket = _context.CreateXSubscriberSocket(); break;
default:
_clientSocket = _context.CreateRequestSocket(); break;
}
_clientSocket.Connect("tcp://" + _ip + ":" + _port);
}

public void StartAsyncReceive()
{
task = Task.Factory.StartNew(() =>
AsyncRead(_clientSocket), TaskCreationOptions.LongRunning);

}

private void AsyncRead(NetMQSocket cSocket)
{
while (true)
{
var msg = cSocket.ReceiveMessage();
OnOnReceive(new DataEventArgs<NetMQSocket, NetMQMessage>(cSocket, msg));
}
}

public NetMQSocket Client
{
get { return _clientSocket; }
}

public T GetClient<T>() where T : NetMQSocket
{
return (T)_clientSocket;
}

public void Send(NetMQMessage msg)
{
_clientSocket.SendMessage(msg);
}

public NetMQMessage CreateMessage()
{
return new NetMQMessage();
}

public NetMQMessage ReceiveMessage()
{
return _clientSocket.ReceiveMessage();
}

public void Dispose()
{
_clientSocket.Dispose();
_context.Dispose();
if (task != null)
{
task.Dispose();
}
}
}

¡¡¡¡¿Í»§¶ËÌṩÁË£¬Í¬²½½ÓÊÜÏûÏ¢ºÍÒì²½½ÓÊÕÏûÏ¢Á½ÖÖ·½Ê½£¬µ±Æô¶¯Ò첽ʱ£¬¾Í¿ªÊ¼Ñ­»·µÄ¶ÁÈ¡ÏûÏ¢ÁË£¬µ±¶Áµ½ÏûϢʱÅ׳öʼþ£¬²¢ÇÒÕë¶ÔÈÎÎñµÈ×öÁË×ÊÔ´µÄÊÍ·Å¡£²¢Ìṩ´´½¨ÏûÏ¢ºÍ·µ»ØMQ¶ÔÏóµÈ¹«¹²·½·¨£¬¿ÉÒÔÔÚ¿ª·¢¹ý³ÌÖпìËÙµÄÈëÊÖºÍʹÓá£

¡¡¡¡Ïȼòµ¥ËµÒ»ÏÂresponseºÍrequestģʽ£¬¾ÍÊÇÏìӦģʽ£¬µ±mq¿Í»§¶ËÏòmqµÄ·þÎñ¶Ë·¢ËÍÏûϢʱ£¬ÐèÒªµÃµ½¼°Ê±µÄÏìÓ¦£¬²¢·µ»Ø¸øÊ¹ÓÃÕß»òÕßÊÇÓû§£¬Õâ¾ÍÐèÒª¼°Ê±ÏìÓ¦µÄ·þÎñ¶Ë³ÌÐò£¬Ò»°ãµÄMQ¶¼»áÓÐÕâÖÖ¹¦ÄÜ£¬Ò²ÊÇʹÓÃ×î¹ã·ºµÄ£¬ÎÒÃǾÍÏÈдһ¸öÕâÖÖÀàÐ͵Ädemo£¬»ùÓÚÎÒÃÇÇ°ÃæÌṩµÄ¿Í»§¶ËºÍ·þÎñ¶Ë¡£

¡¡¡¡Server Console

¡¡¡¡ÕâÀïÎÒÌṩÁË2ÖÖÒ²ÊÇ×î³£ÓõÄ2ÖÖ·þÎñ¶Ë·½Ê½£¬²¢ÇÒÌṩÁ˲»Í¬µÄ´¦Àí·½Ê½¡£

class Program
{
private static OctMQServer _server;
static ServerType _type;
static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
CreateCmd();
}

/// <summary>
/// ´´½¨mq¶ÔÏó
/// </summary>
static void Create()
{
_server = new OctMQServer();
_server.OnReceive += server_OnReceive;
_server.Init(5555, _type);

}

/// <summary>
/// Ñ¡ÔñÀàÐÍ
/// </summary>
private static void CreateCmd()
{
Csl.Wl(ConsoleColor.Red, "ÇëÑ¡ÔñÄúÒª´´½¨µÄMQ·þÎñ¶ËÀàÐÍ");
Csl.Wl(ConsoleColor.Yellow, "1.PUB 2.REP");
var key = System.Console.ReadLine();
switch (key)
{
case "1":
{
_type = ServerType.Pub;
Create();
Cmd();
}

break;
case "2":
_type = ServerType.Response;
Create();
Cmd();
break;
default:
{
CreateCmd();

}
break;
}
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Csl.WlEx((Exception)e.ExceptionObject);
}

/// <summary>
/// ½ÓÊÕÏûÏ¢
/// </summary>
private static void Cmd()
{
if (_type == ServerType.Pub)
{
Csl.Wl(ConsoleColor.Red, "ÇëÊäÈëÄúÒª·¢¸ö¶©ÔÄÕßµÄÐÅÏ¢Ö÷ÌâÓëÐÅÏ¢Óÿոñ·Ö¿ª");
}
else
{
Csl.Wl(ConsoleColor.Red, "µÈ´ýÏûÏ¢");
}
var cmd = System.Console.ReadLine();

switch (cmd)
{
case "exit":
Csl.Wl("ÕýÔڹرÕÓ¦ÓóÌÐò¡£¡£¡£µÈ´ý×îºóÒ»¸öÐÄÌøÖ´ÐÐÍê³É¡£¡£¡£");
_server.Dispose();
break;

default:
{
var str = cmd.Split(' ');
var msg = _server.CreateMessage();
msg.Append(str[0]£¬Encoding.UTF8);
msg.Append(str[1]£¬Encoding.UTF8);
_server.Send(msg);
Cmd();
break;
}
return;
}
}

static void server_OnReceive(object sender, DataEventArgs<NetMQ.NetMQSocket, NetMQ.NetMQMessage> e)
{
var msg = e.Arg2;
var server = e.Arg1;
Csl.Wl(msg.Pop().ConvertToString(Encoding.UTF8));
server.Send("ÄãºÃ,ÄúµÄÇëÇóÒÑ´¦Àí£¬²¢·µ»ØÏûÏ¢¼°´¦Àí½á¹û"£¬Encoding.UTF8);
}
}

¡¡¡¡Client Form

¡¡¡¡¿Í»§¶Ë£¬ÎÒʹÓÃwinformÀ´´¦Àí£¬²¢ÇÒÅäºÏ¿ØÖÆÌ¨Ê¹Óã¬Õâ¸öÓ÷¨ÓÐЩÇÉÃ²»»áµÄͬѧ¿ÉÒÔ˽ÃÜÎÒ£¬ºÙºÙ£¬ÏÈÉϽØÍ¼£¬Ò²ÊÇ¿ÉÒÔͬʱ´¦ÀíÁ½ÖÖ·½Ê½£¬¸ø¸ödemo£¬·½±ã´ó¼ÒÔÚʵ¼ÊÏîÄ¿ÖÐʹÓãº

¡¡¡¡ÏìӦʽ£º

¡¡¡¡¶©ÔÄÕßʽ£º

¡¡¡¡²»»á×ögif ,ÎÒ¾ÍÖð²½Ëµ°É£¬´Ó¶©ÔÄÕßģʽÖÐÎÒÃÇ¿ÉÒÔ¿´µ½£¬ÎҵĴò¿ªË³Ðò1-¡·2->3,ÏÈ´ò¿ª1£¬¶©ÔÄÁËtµÄÖ÷Ì⣬·¢ÁË2¸öÏûÏ¢£¬ÄÚÈÝ1ºÍÄÚÈÝ2£¬µÚÒ»¸ö³ÌÐò¾ùÊÕµ½£¬ÕâʱÎÒÆô¶¯ÁíÍâÒ»¸ö³ÌÐò£¬Í¬Ñù¶©ÔÄtÕâ¸öÖ÷Ì⣬·¢ÏÖÏûÏ¢ÊÇͨ¹ýÂÖѯµÄ·½Ê½·Ö±ðÏòÁ½¸ö¶©ÔÄÕß·¢ËÍ£¬ÕâÑù£¬ÎÒÃÇÔÚ´¦ÀíһЩ±È½ÏºÄʱµÄÒµÎñÂß¼­£¬²¢ÇÒ²»»áÒòΪ²¢·¢³öÏÖÎÊÌâʱ£¬¾Í¿ÉÒÔʹÓöà¸ö¶©ÔÄÕߣ¬·Ö±ð´¦ÀíÒµÎñ´Ó¶ø´ó´óµÄÌá¸ßÎÒÃǵÄϵͳÐÔÄÜ¡£

¡¡¡¡È»ºó´ò¿ªµÚÈý¸ö£¬¶©ÔÄyÕâ¸öÖ÷Ì⣬Õâʱ·¢ËÍyµÄÖ÷ÌâÏûÏ¢£¬Ç°2¸ö¶©ÔÄÕß¾ÍÎÞ·¨ÊÕµ½ÁË£¬ÕâÑùÎÒÃÇ»¹¿ÉÒÔÇø·ÖÒµÎñ£¬½øÐÐ¶à½ø³ÌµÄ´¦Àí£¬¸ü¸ßµÄÌá¸ß¿ÉÓÃÐԺͿÉÀ©Õ¹ÐÔ£¬²¢½áºÏ¸ßÐÔÄܵĻº´æ½â¾ö·½°¸´¦Àí¸ß²¢·¢µÄÒµÎñÂß¼­¡£

¡¡¡¡Ìù³ö¿Í»§¶Ë´úÂ룺

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Csl.Init();
}
/// <summary>
/// mq¿Í»§¶Ë
/// </summary>
private OctMQClient _client;

/// <summary>
/// ¶©ÔÄÕßģʽÁ¬½Ó
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnConn_Click(object sender, EventArgs e)
{
_client = new OctMQClient();
_client.OnReceive += _client_OnReceive;

_client.Init(txtip.Text,int.Parse(txtport.Text),
ClientType.Sub);
var sub = (SubscriberSocket) _client.Client;
sub.Subscribe(txtTop.Text);
_client.StartAsyncReceive();

}

/// <summary>
/// ¶©ÔÄÕßģʽÊܵ½ÏûÏ¢
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void _client_OnReceive(object sender, Core.Args.DataEventArgs<NetMQ.NetMQSocket,
NetMQ.NetMQMessage> e)
{
var msg = e.Arg2;
Csl.Wl("Ö÷Ì⣺"+msg.Pop().ConvertToString
(Encoding.UTF8));
Csl.Wl("ÄÚÈÝ£º" + msg.Pop().ConvertToString
(Encoding.UTF8));
}

/// <summary>
/// ·¢ËÍÏìÓ¦ÏûÏ¢
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSend_Click(object sender, EventArgs e)
{
using (_client = new OctMQClient())
{
_client.Init(txtip.Text, int.Parse(txtport.Text), ClientType.Request);
var content = txtContent.Text;
var msg = _client.CreateMessage();
msg.Append(content, Encoding.UTF8);
_client.Send(msg);
var rmsg = _client.ReceiveMessage();
var reqStr = rmsg.Pop().ConvertToString(Encoding.UTF8);
Csl.Wl(reqStr);
}

}

/// <summary>
/// ÊÍ·Å×ÊÔ´
/// </summary>
/// <param name="e"></param>
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
if (_client != null)
{
_client.Dispose();
}
}
}

¡¡¡¡ºÃÁË£¬´ó¼ÒÏÈÏû»¯Ò»Ï£¬µÈϵÁÐдÍêÁË£¬ÎÒ»áÌá½»µ½githubÉÏ¡£ÏÂÒ»ÆÚ£¬»áдһЩ²¢·¢Çé¿öϵÄÓ¦Óá£

   
3067 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù