Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.08;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
3-24315
Maksim
2003-08-13 12:50
2003.09.08
Как из Delphi грамотно инициализировать атрибуты объекта Oracle??


1-24460
SPIRIT
2003-08-28 08:55
2003.09.08
Гавной форму сделать другую


3-24337
Vinni
2003-08-16 08:27
2003.09.08
Выпадающий список.


14-24641
JohnJ
2003-08-21 02:02
2003.09.08
Кладовка


3-24372
AAAAz
2003-08-13 04:35
2003.09.08
Тип базы данных