有幾件事情要注意使用建議的架構:
Trying to send an HTTP request over sockets
原則上,你需要注意的是,即使你可以使用套接字較低水平聊天HTTP ,這種方式的溝通會失敗的情況很多。如果用戶在其瀏覽器中啓用了代理服務器,則主要發生這些故障,因爲在通過套接字連接時沒有發現和隨後使用代理的有效方法。
爲了製作策略服務器,您可以使用TcpListener類。你會開始聽如下:
var tcpListener = new TcpListener(IPAddress.Any, 843);
tcpListener.start();
tcpListener.BeginAcceptTcpClient(new AsyncCallback(NewClientHandler), null);
的方法NewClientHandler將有以下形式:
private void NewClientHandler(IAsyncResult ar)
{
TcpClient tcpClient = tcpListener.EndAcceptTcpClient(ar);
...
在這一點上,你可能要到的TcpClient對象提供的一類自己的創作來處理的驗證來自套接字的數據。我將稱之爲RemoteClient。
在RemoteClient,你有這樣的事情:
var buffer=new byte[BUFFER_SIZE];
tcpClient.GetStream().BeginRead(buffer, 0, buffer.Length, Receive, null);
和接收方法:
private void Receive(IAsyncResult ar)
{
int bytesRead;
try
{
bytesRead = tcpClient.GetStream().EndRead(ar);
}
catch (Exception e)
{
//something bad happened. Cleanup required
return;
}
if (bytesRead != 0)
{
char[] charBuffer = utf8Encoding.GetChars(buffer, 0, bytesRead);
try
{
tcpClient.GetStream().BeginRead(buffer, 0, buffer.Length, Receive, null);
}
catch (Exception e)
{
//something bad happened. Cleanup required
}
}
else
{
//socket closed, I think?
return;
}
}
和一些發送方法:
public void Send(XmlDocument doc)
{
Send(doc.OuterXml);
}
private void Send(String str)
{
Byte[] sendBuf = utf8Encoding.GetBytes(str);
Send(sendBuf);
}
private void Send(Byte[] sendBuf)
{
try
{
tcpClient.GetStream().Write(sendBuf, 0, sendBuf.Length);
tcpClient.GetStream().WriteByte(0);
tcpClient.GetStream().WriteByte(13); //very important to terminate XmlSocket data in this way, otherwise Flash can't read it.
}
catch (Exception e)
{
//something bad happened. cleanup?
return;
}
}
這是所有重要的細節我想。我前一段時間寫過這個... Receive方法看起來可以用返工做,但它應該足以讓你開始。
挖掘出我的實現... – spender 2009-09-11 08:50:20
至於監聽「」,我認爲這將是更好地檢查包含單節點<政策性文件的XML - 請求/>,因爲這是規範實際上說的。 – spender 2009-09-11 09:40:06
糟糕。看起來這就是你實際說的,但它被吞噬了。已修改您的帖子。 – spender 2009-09-11 11:06:42