Jag har en fråga om det finns någon BRA teknik för att ta emot data från en socket ellet TcpClient i .NET. Använd Accept istället och spawna vidare hanteringen till en annan tråd. Accept? ok. Nedanstående kod har inte fungerat eftersom strömmen kanske inte har hunnit bli fylld Jag har testat -1 och det fungerar inte, jag tror som jag sa tidigare att det är först när strömmen stängs som den retunerar -1. Jag valde att köra på alternativ 3 i min lösning, det kändes som den säkraste just för mig eftersom protokollet jag använde mig av inte gav exakta storleken på data som skickades, olika applikationer hade sina egna implementationer på mängd data som skickades.TcpClient och receive
Det är inte alltid man vet exakt hur mycket bytes som man ska ta emot och vad kan man göra då?
1. Ett alternativ som jag har sätt är att använda
while(TcpClient.Available > 0)
-- recieve kod.
2. eller
while(TcpClient.Available < 1)
Thread.Sleep(50);
while(TcpClient.Available > 0)
--recive kod
Thread.Sleep(50)
3. eller om man vet om hur strömmen skall sluta vilket man ofta kanske inte vet om?
while(Encoding.GetString(ReceivedBuffer, ReceivedBytesCount-3, 3) == "end")
--receive kod
4. eller om man vet exakt hur mycket data som skall komma.
while(ReceivedBuffer.Length > TotalBytesReceived)
-- receive kod
Problemet med den första är att vad jag har märkt att TcpClient.Available inte uppdateras
såpass snabbt som den behöver. Detta leder till att den är 0 medans data håller på att skickas.
Problemet med den andra är att den tar mycket längre tid och ändå kanske får samma problem som
alternativ 1 har.
Problemet med den tredje är att man ofta kanske inte vet vad den skall sluta med.
Problemet med den fjärde är att man kanske inte alltid kan få antalet man behöver.. eller om servern skall ange det så kan man inte lita på hur mycket bytes som kommer.
Finns det några fler alternativ där man kan lösa detta på ett smidigare sätt eller är det bara att välja och vraka mellan dessa som jag har beskrivit?
Sv: TcpClient och receive
Sv:TcpClient och receive
Jag kanske inte förklarade mig tillräckligt tydligt, det är alltså klienten jag pratar om och inte servern.Sv: TcpClient och receive
men strömmen har ju read och readbyte funktioner som båda returnerar -1 när strömmen är slut, så varför kan du inte använda det på klienten?Sv:TcpClient och receive
men om det du skriver stämmer så borde det stå while(BytesReadCount > -1) antar jag.
Men strömmen på en socket tar väl aldrig slut sålänge den inte stängs?
while(BytesReadCount > 0)
{
BytesReadCount = BinaryReader(ReceivedBytesArray, TotalReceivedBytes, ReceivedBytesArray.Length - TotalReceivedBytesCount);
TotalRecivedBytesCount = TotalReceivedBytesCount + BytesReadCount;
}
Sv:TcpClient och receive
Sv: TcpClient och receive