Не могу понять как работает NetworkStream - C#
Формулировка задачи:
Всем Привет!
Есть код из Албахари:
Мне не совсем понятно как работает NetworkStream. В коде я пометил строчку номером 1. Почему код в ней не вызывается сразу как инфа записана в поток NetworkStream и нам не выводится Hello? Как BinaryReader в этой строчке понимает что поток предназначен не ему а ТСПлистенеру? Каккая скрытая механика содержится в NetworkStream?
static void Main()
{
new Thread(Server).Start();// Запустить метод сервера параллельно.
Thread.Sleep(500);// Предоставить серверу время для запуска.
Client();
}
static void Client()
{
using (TcpClient client = new TcpClient("localhost", 51111))
using (NetworkStream n = client.GetStream())
{
BinaryWriter w = new BinaryWriter(n);
w.Write("Hello");
w.Flush();
Console.WriteLine(new BinaryReader(n).ReadString()); // 1
}
}
static void Server() // Обрабатывает одиночный клиентский запрос и завершается
{
TcpListener listener = new TcpListener(IPAddress.Any, 51111);
listener.Start();
using (TcpClient c = listener.AcceptTcpClient())
using (NetworkStream n = c.GetStream())
{
string msg = new BinaryReader(n).ReadString();
BinaryWriter w = new BinaryWriter(n);
w.Write(msg + " right back!");
w.Flush(); // Должен быть вызван метод Flush, поскольку
} // мы не освобождаем средство записи,
listener.Stop();
}
// Hello right back!Решение задачи: «Не могу понять как работает NetworkStream»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;
class TcpDemo {
static void Main() {
new Thread(Server).Start();
Thread.Sleep(500);
Client();
Console.ReadLine();
}
static void Client() {
using (TcpClient client = new TcpClient("localhost", 51111)) {
using (NetworkStream n = client.GetStream()) {
BinaryWriter w = new BinaryWriter(n);
w.Write("Hello");
w.Flush();
Console.WriteLine(new BinaryReader(n).ReadString());
}
}
}
static void Server() {
TcpListener listener = new TcpListener(IPAddress.Any, 51111);
listener.Start();
using (TcpClient client = listener.AcceptTcpClient()) {
using (NetworkStream n = client.GetStream()) {
string msg = new BinaryReader(n).ReadString();
BinaryWriter w = new BinaryWriter(n);
w.Write(msg + " right back!");
w.Flush();
}
}
listener.Stop();
}
}