2 Kasım 2017 Perşembe

NetworkStream Sınıfı

Giriş
Bu sınıfı kullanmak için şu satırı dahil ederiz.
using System.Net.Sockets.NetworkStream;
Sunucuya bağlanıp ardından bir işlem yapıp bağlantıyı kapatacaksak şöyle yaparız.
using (TcpClient client = ...)
{
  using (NetworkStream stream = client.GetStream())
  {
    try
    {
      ...
    }
    catch (SocketException e)
    {
      ...
    }
  }
}
Constructor
Genellikle bir TcpClient nesnesi tarafından yaratılır.
TcpClient client = ...;
NetworkStream stream = client.GetStream();
Constructor - Socket
Şöyle yaparız.
Socket soc = listener.AcceptSocket();
Stream stream = new NetworkStream (soc);
DataAvailable Alanı
Şöyle yaparız.
if (stream.DataAvailable) {...}
Read metodu
Şöyle yaparız.
byte[] bytesToRead = new byte [tcpClient.ReceiveBufferSize];
int bytesRead = stream.Read (bytesToRead, 0, client.ReceiveBufferSize);
ReadAsync metodu
Örnek
Şöyle yaparız.
async Task<string> RecieveMessage(NetworkStream stream)
{
  byte[] buffer = new byte[256];
  string message = null;
  int x = await stream.ReadAsync(buffer, 0, buffer.Length);
  message += Encoding.ASCII.GetString(buffer);
  return message;
}
Örnek
Şöyle yaparız.
while (true)
{

 // Incoming message may be larger than the buffer size. 
 do
 {
    byte[] myReadBuffer = new byte[10240 * 5];
    await stream.ReadAsync(myReadBuffer, 0, myReadBuffer.Length).
    ContinueWith((numberOfBytesRead) =>
    {
      string str = Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead.Result);
      ...
    });

}
while (stream.DataAvailable);
Write metodu
Şöyle yaparız.
NetworkStream nwStream = tcpClient.GetStream();
byte[] bytesToSend = ...;

stream.Write(bytesToSend, 0, bytesToSend.Length);
WriteAsync metodu
Şöyle yaparız.
async Task<int> SendMessage(NetworkStream stream, string message)
{
  byte[] bytes = Encoding.ASCII.GetBytes(message + "\r\n");
  await stream.WriteAsync(bytes, 0, bytes.Length);
  return 1;
}
Diğer
Aşağıda string, byte[] gibi nesneleri daha kolay gönderme alma için kullanılabilecek yardımcı metodlar var.

NetworkStream ve String
String yazmak için şöyle yaparız.
public class StreamUtil
{
  public static void SendString (NetworkStream stream, string str) {
    byte[] data = Encoding.ASCII.GetBytes (str);
    stream.Write (BitConverter.GetBytes (data.Length), 0, 4);
    stream.Write (data, 0, data.Length);
  }

  public static string ReceiveString (NetworkStream stream) {
    int bytesToRead = BitConverter.ToInt32(ReadBytes (stream, 4), 0);
    byte[] data = ReadBytes (stream, byteCountToRead);
    return Encoding.ASCII.GetString (receivePacket);
  }
}
ReadBytes metodu şöyledir.
public class StreamUtil
{
  public static byte[] ReadBytes (NetworkStream pStream, int byteCount) {
    byte[] bytes = new byte[byteCount];
    int bytesRead = 0;
    int totalBytesRead = 0;

    try {
      while (
        totalBytesRead != byteCount && 
        (bytesRead = stream.Read (bytes, totalBytesRead,
                                  byteCount - totalBytesRead)) > 0
        ){
            totalBytesRead += bytesRead;
 
          }
        } catch (Exception e) {
          ...
        }
        return (totalBytesRead == byteCount) ? bytes : null;
    }
}
NetworkStream ve Writer
Şöyle yaparız.
NetworkStream stream = ...;
StreamWriter streamWriter = new StreamWriter (stream);
streamWriter.WriteLine("...");


Hiç yorum yok:

Yorum Gönder