ms.Close(); //close the MemoryStream when done
It's a good thing that you close the ms (MemoryStream) but there are two more to dispose.
The bitmap and graphics instances also need to be disposed/closed. The same applies to the NetworkStream but I got the impression that you don't know the using statement that allows you to automatically handle resources so:
NetworkStream stream = getSelectedClient().GetStream(); .. fstream.Close();
would become:
using(var networkStream = getSelectedClient().GetStream())
{
..
} // at this point it will be closed/disposed by the runtime
The benefit of this is that it will be correctly disposed even if an exception occurs. Without it you would need to write the try/finally yourself (what a using actually does for you (or rahter the compiler))
NetworkStream networkStream = null;
try
{
networkStream = getSelectedClient().GetStream();
..
}
finally
{
networkStream?.Close();
}
You can use the same pattern for bitmaps, graphics and anything else that is IDisposable.