Форум: "Сети";
Текущий архив: 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