Здравствуйте.
Мне нужно написать простейший слушатель порта 8080, на который делается POST запрос, считать данные и отправить строку в ответ. Сделал так:
Код | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Compression;
using System.IO; using System.Net; using System.Net.Sockets; using System.Threading;
namespace Zipper { class Program {
class Server { TcpListener listener;
public Server(int port) { listener = new TcpListener(IPAddress.Any, port); listener.Start();
while (true) { ThreadPool.QueueUserWorkItem(new WaitCallback(ClientThread), listener.AcceptTcpClient()); } }
static void ClientThread(Object StateInfo) { new Client((TcpClient)StateInfo); }
~Server() { if (listener != null) listener.Stop(); }
}
class Client { public Client(TcpClient Client) {
var data = new byte[Client.ReceiveBufferSize]; StringBuilder dataString = new StringBuilder(); int readCount; using (var ns = Client.GetStream()) { while ((readCount = ns.Read(data, 0, Client.ReceiveBufferSize)) != 0) { dataString.Append(Encoding.ASCII.GetString(data, 0, readCount)); } }
// write response string Html = "<html><body><h1>It works!</h1></body></html>"; string Str = "HTTP/1.1 200 OK\nContent-type: text/html\nContent-Length:" + Html.Length.ToString() + "\n\n" + Html; byte[] Buffer = Encoding.ASCII.GetBytes(Str); Client.GetStream().Write(Buffer, 0, Buffer.Length);
Client.Close(); }
}
static void Main(string[] args) {
Console.WriteLine("Started");
int maxThreads = Environment.ProcessorCount * 4; ThreadPool.SetMaxThreads(maxThreads, maxThreads); ThreadPool.SetMinThreads(2, 2);
new Server(8080);
} } }
|
Но он вешается на вот этом: "while ((readCount = ns.Read(data, 0, Client.ReceiveBufferSize)) != 0)". Первый кусок считывается. Собственно на нем все и заканчивается, передача в него укладывается. А вот при попытке чтения дальше висит пока клиент не разорвет соединение. Вопрос: как правильно определить конец передачи? Можно было бы проверять readCount и если оно меньше Client.ReceiveBufferSize то считать что на этом все. Но как быть если размер моей передачи равен или кратен Client.ReceiveBufferSize? Меньше не будет, и больше не будет тоже.
Буду благодарен за совет, а еще лучше пример 
Кстати, вот скрипт клиента на Перл. Может он поможет понять причину.
Код | use strict; use warnings; use utf8;
use XML::LibXML; use LWP::UserAgent;
# prepare xml
my $dom = XML::LibXML::Document->new('1.0', 'UTF-8'); my $root = $dom->createElement('archive'); $dom->setDocumentElement($root);
my @files = ( ["c:/byggeweb/ClipboardMonitor.exe", "ClipboardMonitor.exe"], ["c:/byggeweb/dbtest.pl", "dbtest.pll"] );
foreach my $data (@files){ my $file = $root->addNewChild(undef, 'file'); $file->addNewChild(undef, 'source')->appendText($data->[0]); $file->addNewChild(undef, 'newname')->appendText($data->[1]); }
my $xml = $dom->toString(0);
# repare agent
my $agent = LWP::UserAgent->new(); my $resp = $agent->post( 'http://localhost:8080', Content => $xml );
unless($resp->is_success()){ die " Request failed"; }
print $resp->decoded_content();
|
|