Avatar billede Simon Praktikant
17. maj 2006 - 17:24 Der er 4 kommentarer og
1 løsning

Detektering af afslutning på xml document igennem socket

Jeg har et dataset som jeg gerne vil sende fra en pc til en anden gennem en TCP socket. Dette kan jeg også gøre med nedenstående kode, hvor afsenderen lukker forbindelse med "close()" når xml dokumentet er sendt. Jeg imidlertid ikke at lukke forbindelsen men bevare denne. Hvis jeg undlader at lukke den, bliver modtageren imidlertid ved med at lytte og bliver hængende i "ReadXml". Hvordan "ReadXML" på modtagersiden ud af at hele xml documentet er kommet frem? Og skal afsenderen eventuelt fortælle dette?


Afsender:

server = new TcpListener(System.Net.IPAddress.Parse("192.168.36.102"), 5454);
server.Start();
client = server.AcceptTcpClient();
reader = new StreamReader(client.GetStream());
writer = new StreamWriter(client.GetStream());
(new Thread(new ThreadStart(Reader))).Start();
rdt.WriteXml(writer);
writer.Flush();
writer.Close();

Modtager:

DataSet1.MyTable rdt = new DataSet1.MyTable();
rdt.ReadXml(reader);
Avatar billede arne_v Ekspert
17. maj 2006 - 17:37 #1
der er grundliggende 2 metoder:

1)  luk forbindelsen naar du er faerdig

2)  send laengden af data inden selve data saa modtager ved naar alt er modtaget

kan du ikke lide #1 maa det jo vaere #2

din kode understoetter ikke #2 umiddelbart, men hvis du skriver til
et byte array eller en string, saa kan du sende langden foerst og saa sende
data bagefter
Avatar billede Simon Praktikant
17. maj 2006 - 17:44 #2
Ok, nummer 2 har jeg også overvejet, men hvad er så ideen med WriteXML() når man alligevel skal mellemlagre det hele i en String?

Egentlig burde ReadXML vel sagtens kunne stoppe med at lytte når hele xml-strengen var kommet igennem. Det skulle jo bare lede efter et stop-tag svarende til det første i xml'en. Det er jo ikke nogen stor kunst. hmm.

Hvad med en 3. mulighed: at sende et slut-tag, eks. "<EOF>" som det sidste og så read'e bytevis?
Avatar billede arne_v Ekspert
17. maj 2006 - 17:49 #3
ideen med WriteXMl er at det er godt nok til 99% af tilfaeldene

du har nogle specielle krav => du skal lave noget specielt kode

man kunne muligvis lave noget fusk paa modtager siden i form af en reader
der returnerede en falsk EOF efter slut tag

men jeg synes ikke at det er nogen paen loesning

jeg tror saagar at jeg har noget kode liggende som kunne rettes til hvis
du alligevel gaar den vej
Avatar billede Simon Praktikant
19. maj 2006 - 21:35 #4
Tak for hjælpen. Jeg valgte mulighed #2. Hvis du smider svar får du point.
Avatar billede arne_v Ekspert
19. maj 2006 - 21:42 #5
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester