想我會回答我的問題。
我實施了我自己的解決方案。
關鍵點,我的解決方案:
名爲IPClient一類包裝了一個TcpClient的情況下,使用呼叫TcpClient.BeginConnect,的BeginRead,等它有一個定時器用於如果它失去連接重新連接的異步模式。 這是連接到設備的類。
它的公共接口會是這個樣子:
public class IPClient{
public event EventHandler<MyConnectedArgs> Connected;
public event EventHandler<MyDisconnectedArgs>Disconnected;
public event EventHandler<MyDataReceivedArgs> DataReceived;
public bool Connect(string address, int port){...}
public bool Disconnect() {...}
}
要打開,將允許其他客戶端連接的端口,我用這個庫:http://codeproject.com/KB/IP/BasicTcpServer.aspx和修改它一下。
它的工作就是打開一個端口,接受連接,並執行以下操作:
在連接處理器
- ,啓動監聽端口在斷開處理
- ,停止監聽端口
- 在DataReceived處理程序中,將數據廣播到任何連接的客戶端。
我會拋棄其餘無聊的細節,但說它不是「太難」,最終我不得不推出自己的。
命令行用法:MyApp.exe的REMOTE_ADDR REMOTE_PORT listen_port我的程序主要的
僞碼/主要思路:
static int Main(string[] args){
//SetConsoleCtrlHandler(my callback re: ctrl+C,etc)
//get command line params
var ipClient = new IPClient();
var myprovider = MyTcpServiceProvider();
var server = new TcpServer(myProvider, listenPort);
ipClient.Connected += (sender, e) => server.Start();
ipClient.Disconnected += (sender,e) => server.Stop();
ipClient.DataReceived += (sender,e)=> provider.BroadcastToClients(e.Data);
ipClient.Connect(remoteAddress, remotePort);
//wait for Ctrl+C or program exit
//shutdown code,etc
return 0;
}
來源
2011-09-15 20:06:48
Wes
謝謝你的指針。事實上,我已經在昨天/今天自己寫了這個程序。我使用了這個項目的修改版本:http://www.codeproject.com/KB/IP/BasicTcpServer.aspx 基本上,我使用BeginConnect,BeginRead等的異步模型創建了一個TcpClient包裝類,上面的TcpServer類和一個自定義的TcpServiceProvider,迄今爲止都很好。 – Wes