Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TcpClient + POST 
:(
    Опции темы
infarch
Дата 26.9.2012, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: 1
Всего: 1



Здравствуйте.

Мне нужно написать простейший слушатель порта 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? Меньше не будет, и больше не будет тоже.

Буду благодарен за совет, а еще лучше пример smile

Кстати, вот скрипт клиента на Перл. Может он поможет понять причину.

Код

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();


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0854 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.