Несколько советов по использованию предложенной вами архитектуры:
Попытка отправить HTTP-запрос через сокеты
Как правило, вы должны знать, что даже если вы можете общаться по 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 выглядит так, как будто он может помочь с переделкой, но этого должно быть достаточно для начала работы.