J'écris une application cliente (service windows) qui lit régulièrement des données et écrit des données sur un serveur. Le serveur est configuré pour toujours répondre au client si le cadre qu'il a reçu est compris. J'ai la méthode suivante pour l'envoi et la réception:Quand fermer tcpclient et networkstream
public byte[] Sendmessage(byte[] arrbMessage)
{
byte[] arrbDataInput; // byteArray for received data
try
{
_oStream = _oClient.GetStream(); // try to get a networkstream
}
catch (InvalidOperationException e)
{
Connect(); // if this fails, tcpclient is probably disconnected, reconnect client and networstream
}
if (_oClient.Connected)
try
{ // Send the arrbMessage to the connected TcpServer.
string sKey = "123456789ABC";
byte[] arrbMessageEncrypted = EncryptedFrame(arrbMessage, sKey);
if (_oStream.CanWrite) // if stream is available for writing
{
_oStream.Write(arrbMessageEncrypted, 0, arrbMessageEncrypted.Length); //send message
_oStream.Flush(); //Clear stream
}
// Receive the TcpServer.response.
if (_oStream.CanRead) // if stream is available for reading
{
arrbDataInput = new byte[256]; // set inputbuffer to 256
//_oClient.NoDelay = true; // don't wait if nothing is received
// Read the first batch of the TcpServer response bytes.
_oStream.ReadTimeout = 2000;
Int32 bytes = _oStream.Read(arrbDataInput, 0, arrbDataInput.Length); //read out data, put datalength in "bytes"
Array.Resize(ref arrbDataInput, bytes); // resize array to length of received data
_oStream.Close(); // close the network stream
if (arrbDataInput.Length > 0)
{
byte[] arrbMessageDecrypted = DecryptedFrame(arrbDataInput, sKey);
if (CheckBusy(arrbMessageDecrypted))
throw new ArgumentNullException();
return arrbMessageDecrypted;
}
return null; // return the received data
}
}
catch (ArgumentNullException e)
{
return Sendmessage(arrbMessage);
}
catch (SocketException e)
{
}
catch (System.IO.IOException e)
{
while (!_oClient.Connected)
{
Connect();
}
}
else
{
while (!_oClient.Connected)
{
Connect();
}
}
return null;
}
J'ai eu beaucoup de difficultés en laissant le flux ouvert, donc au moment où nous fermons chaque fois après l'envoi et la réception de données. Dois-je laisser le flux et tcpclient ouverts? la fonction est appelée régulièrement.