Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.09.08;
Скачать: [xml.tar.bz2];

Вниз

TCP ili UDP?   Найти похожие ветки 

 
gala   (2003-07-03 17:51) [0]

Привет мастера,

у меня вопрос:

я сделала так,что передаю счас ХМЛ-файл c ТCP(Indy), все идет, но очень медленно,нуу где то 10 сек при 6 Мб. Мне ето не подходит.Знаю, что TCP медленный. Можно использовать UDP,он быстрый, но теперь другая проблема: При UDP нет уверенности, что все части нормально придут. Да и я не представляю, как я смогу потом на сервере все ети части склеить в нормальном порядке, а ведь при XML ето важно.

Может есть все таки какой нибудь трюк, как перетаскить текстовый фаил на сервер с UDP, притом потом все нормально склеить?А может вообсче другие возможности есть? Ведь я работаю локал, и скорость должна быть быстрой, ведь копирование фаила с жесткого диска на другой длится не больше одной секунды, так почему я не могу локал так же передать через Sockets?

надеюсь проблема понята и может у кого есть ответы.Спасибо заранее.

гала


 
AlexRush   (2003-07-03 18:50) [1]

>Может есть все таки какой нибудь трюк, как перетаскить текстовый
>фаил на сервер с UDP, притом потом все нормально склеить?

- это будет "еще" медленнее, чем TCP. А вообще-то дело не в TCP.
0.6 Mb/сек - не есть предел для TCP(теор. его вообще нет, только аппаратный). Дело наверняка в твоей реализации передачи.
Приведи код.


 
gala   (2003-07-04 12:21) [2]

Конечно я напишу код, но он на JAVA, так как Client написан на JAVA, а Server на Delphi.

Вот Server на Delphi:

procedure TForm1.Button1Click(Sender: TObject);
Server := TIdTCPServer.Create(Form1);
Server.DefaultPort := 4000;
Server.OnExecute := ServerExecute;
Server.TerminateWaitTime := 5000;
Server.ListenQueue := 15;
Server.CommandHandlersEnabled := true;
Server.Active := true;
end;

procedure TForm1.ServerExecute(AThread: TIdPeerThread);
var
rec : TStringList;
begin
rec.add(AThread.Connection.AllData);
end;

А вот Client:

public class client {

public static void main(String[] args) {
try {
Socket con = new Socket("localhost", 4000);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter
(con.getOutputStream()));


DocumentBuilderFactory factory;
DocumentBuilder builder;
Document document = null;
try{
factory = DocumentBuilderFactory.newInstance();
builder = factory.newDocumentBuilder();
document = builder.parse("D:/test.xml" );
}catch( SAXParseException spe ) {
}

Transformer transformer = TransformerFactory.newInstance().newTransformer();
DOMSource source = new DOMSource( document );
StreamResult result = new StreamResult(out);
( source, result ) Конечно я напишу код, но он на JAVA, так как Client написан на JAVA, а Server на Delphi.

Вот Server на Delphi:

procedure TForm1.Button1Click(Sender: TObject);
Server := TIdTCPServer.Create(Form1);
Server.DefaultPort := 4000;
Server.OnExecute := ServerExecute;
Server.TerminateWaitTime := 5000;
Server.ListenQueue := 15;
Server.CommandHandlersEnabled := true;
Server.Active := true;
end;

procedure TForm1.ServerExecute(AThread: TIdPeerThread);
var
rec : TStringList;
begin
rec.add(AThread.Connection.AllData);
end;

А вот Client:

public class client {

public static void main(String[] args) {
try {
Socket con = new Socket("localhost", 4000);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter
(con.getOutputStream()));


DocumentBuilderFactory factory;
DocumentBuilder builder;
Document document = null;
try{
factory = DocumentBuilderFactory.newInstance();
builder = factory.newDocumentBuilder();
document = builder.parse("D:/test.xml" );
}catch( SAXParseException spe ) {
}

Transformer transformer = TransformerFactory.newInstance().newTransformer();
DOMSource source = new DOMSource( document );
StreamResult result = new StreamResult(out);
transformer.transform( source, result ); //Wot etot uchastok dlitsya 10 sek pri 6 Mb.
con.close();
} catch (UnknownHostException uhe) {
}

Я думаю ето может из за того, что transformer преобразовывает ХМЛ-Документ а потом пересылает ево. Черт ево знает :(



 
Jao   (2003-07-04 13:02) [3]

а навига тебе его парсером разбирать? лучше посылай из файлового потока.


 
AlexRush   (2003-07-04 13:47) [4]


>procedure TForm1.ServerExecute(AThread: TIdPeerThread);
>var
>rec : TStringList;
>begin
> rec.add(AThread.Connection.AllData);
>end;

- А где создание/инициализация rec ?? Ведь здесь AccessViolation стопудовый...

> из за того, что transformer преобразовывает ХМЛ-Документ
- а почему было сразу не сказать ? Наверняка из-за этого. Я в Java"вских библиотеках и ф-ях не разбираюсь, но уверен, что работа с TCP там органзована нормально.
Могу посоветовать не передавать все данные одним куском в 6 М, а разбивать на пакетики где-нибудь по 64к.


 
gala   (2003-07-04 13:48) [5]

Client написан мной для теста, поетому мне надо как то получить етот документ, вот я и делаю parse. А в настоясчей программе етот документ уже внутри.


 
gala   (2003-07-04 13:53) [6]

Да ета переменная у меня global, ето я так написала, чтобы понятно было,откуда rec.add и че такое rec.

Может быть ето и идет от трансформер, но вся фигня в тоm, что если я тоже самое делаю, но в фаил, то ето длится 2 сек, а с Буффер 10 сек. Отсюда вывод, что ето не трансформер наверно виноват.

transformer.transform( source, result ); //result eto Buffer: 10 sek
transformer.transform( source, result );//result, eto fail(local): 2 sek


 
AlexRush   (2003-07-04 14:06) [7]

ну не знаю... обратись к Jaвистам. :|


 
gala   (2003-07-04 16:27) [8]

Такс...теперь я выяснила, что ето Сервер медленно принимает. Посчитала, 15 сек он читает:

AThread.Connection.Alldata; //15 sek. chitaet!!

Ну и че ето за фигня? :(

AThread.Connection.ReadLn; //Попробовала ето, так сервер только первую строчку читает, а остальное и ухом не ведет..

Еклмн...прям и не знаю..че делать :(


 
Jao   (2003-07-04 17:28) [9]

>gala

возможно, сервер читает до тех пор пока не будет разорвано соединение, а чтобы этого не было тебе сначала надо передать длину передаваемого сообщения и потом читать только необходимое число байт, типа: AThread.Connection.ReadStream(fs,sz,false), где fs - строковой или файловый поток, а sz - его длина


 
Morfein   (2003-07-05 20:18) [10]

Сервер читает до тех пор, пока есть что читать.

>> AlexRush
"Один кусок размером 6Мб" - это ты хорошо придумал... учитывая, что максимальный размер сегмента 64Кб, а реально используемый (чаще всего) - 8Кб...

>> gala
ты бы посчитала всё-таки размер тех данных, которые реально в сеть уходят, а не 6Мб до преобразования... потому как передача данных автоматизирована и ты к программированию сетевой части непричастна...


 
Alex Konshin   (2003-07-06 07:03) [11]

Ты когда-нибудь пробовала пропускать через DOM даже локальный файл? Он сам по себе тормозной до жути. Попробуй просто прочитать файл и посмотреть, как это будет работать.


 
Мимопроходящий   (2003-07-07 09:48) [12]

Извините, но я одного не понял - где инициализация rec (типа TStringList) ?!


 
AlexRush   (2003-07-07 11:00) [13]

>> Morfein © (05.07.03 20:18) >> Я имел в виду не TCP пакеты. Насколько я заметил, при исп. WinSock не стоит писать send(s,pBuf,buflen,flags), где buflen > 64к. Это тормозит локальную систему. (Если я не прав, поправте меня)


 
gala   (2003-07-07 16:49) [14]

Ну вот я опять и появилась :)

Такс...пришел шеф и сказал, что так все равно не пойдет, так как ето очень медленно. Короче, надо делать так:

Когда я посылаю документ на Server, там ево уже должен ждать Parser(SAX конечно). И етот Parser должен уже сразу начинать parse. Типа для етого и сусчествует SAX. Я конечно все ето понимаю, но как ето сделать то? То есть у меня была ошибка, что я хотела сначало документ получить, а только потом parse, а надо сделать так, чтобы Parser сразу начинал parse, бес сохранения документа. Вопрос в том, может ли сам Parser контролировать Socket и реагировать на поступаюсчие данные?



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2003.09.08;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.007 c
1-24413
FoxBox
2003-08-25 15:37
2003.09.08
Наличие метода в классе


3-24305
demonyator
2003-08-18 17:39
2003.09.08
Order by и редактирование...


3-24297
off
2003-08-19 12:25
2003.09.08
Первая запись через ХП (на FB)&


14-24662
Карелин Артем
2003-08-20 15:56
2003.09.08
Почему сервис не может работать с модулем Filectrl?


14-24639
Nik8.
2003-08-21 12:13
2003.09.08
Память чужой проги





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский