Как TCP-сервер сохраняет сетевые потоки каждого подключающегося клиента с соответствующими сокетами (ссылка на код Fleck ⇐ C#
Как TCP-сервер сохраняет сетевые потоки каждого подключающегося клиента с соответствующими сокетами (ссылка на код Fleck
Я новичок в сокетах, и у меня проблемы с пониманием общей картины реализации TCP Socket Server с использованием библиотеки Fleck. Из моего понимания этого вопроса я могу сделать вывод, что WebServer использует WebSockets под капотом.
Связь клиент-сервер устанавливается после рукопожатия. Сервер поддерживает отдельные сокеты для каждого клиентского соединения, которые позже используются сервером для связи с этими клиентами.
Клиентский сокет, назначенный сервером, имеет сетевой поток, который он использует для связи с сервером.
Однако следующий код используется Fleck для принятия и связи с клиентами, используя только один сетевой поток, связанный с его сокетом. Я не понимаю, как каждый клиент может общаться только через сокет сервера, лежащий в основе его сетевого потока.
Вот исходный код серверного сокета.
публичный класс SocketWrapper: ISocket { частный сокет только для чтения _socket; частный поток _stream; частный CancellationTokenSource _tokenSource; частная TaskFactory _taskFactory; общедоступный SocketWrapper (сокет сокета) { _tokenSource = новый CancellationTokenSource (); _taskFactory = новая TaskFactory(_tokenSource.Token); _socket = сокет; если (_socket.Connected) _stream = новый NetworkStream(_socket); // здесь сокет сервера связан с сетевым потоком. } public Task Receive (буфер byte[], обратный вызов Action, ошибка Action, смещение целого числа) { пытаться { Func начать = (cb, s) => _stream.BeginRead(buffer, offset, buffer.Length, cb, s); // Здесь возникает проблема: почему один и тот же поток сокетов сервера используется для чтения от любого случайного клиента, который отправляет данные на сервер? Task Task = Task.Factory.FromAsync(begin, _stream.EndRead, null); Task.ContinueWith(t => обратный вызов(t.Result), TaskContinuationOptions.NotOnFaulted) .ContinueWith(t => error(t.Exception), TaskContinuationOptions.OnlyOnFaulted); Task.ContinueWith(t => error(t.Exception), TaskContinuationOptions.OnlyOnFaulted); возвратное задание; } поймать (Исключение e) { ошибка(е); вернуть ноль; } } public Task Accept (обратный вызов Action, ошибка Action) { Func end = r => _tokenSource.Token.IsCancellationRequested? null: новый SocketWrapper(_socket.EndAccept(r)); вар задача = _taskFactory.FromAsync(_socket.BeginAccept, end, null); Task.ContinueWith(t => обратный вызов(t.Result), TaskContinuationOptions.OnlyOnRanToCompletion) .ContinueWith(t => error(t.Exception), TaskContinuationOptions.OnlyOnFaulted); Task.ContinueWith(t => error(t.Exception), TaskContinuationOptions.OnlyOnFaulted); возвратное задание; } общедоступная отправка задачи (буфер byte[], обратный вызов действия, ошибка Action) { если (_tokenSource.IsCancellationRequested) вернуть ноль; пытаться { Func начать = (cb, s) => _stream.BeginWrite(buffer, 0, buffer.Length, cb, s); // Как сервер может отправить сообщение какому-либо конкретному клиенту, используя собственный сетевой поток?? Задача Task = Task.Factory.FromAsync(begin, _stream.EndWrite, null); Task.ContinueWith(t => callback(), TaskContinuationOptions.NotOnFaulted) .ContinueWith(t => error(t.Exception), TaskContinuationOptions.OnlyOnFaulted); Task.ContinueWith(t => error(t.Exception), TaskContinuationOptions.OnlyOnFaulted); возвратное задание; } поймать (Исключение e) { ошибка(е); вернуть ноль; } } } Пытался прочитать в MSDN о том, как взаимодействуют сервер и клиент, но не смог понять тот факт, о котором пытался спросить.
Я новичок в сокетах, и у меня проблемы с пониманием общей картины реализации TCP Socket Server с использованием библиотеки Fleck. Из моего понимания этого вопроса я могу сделать вывод, что WebServer использует WebSockets под капотом.
Связь клиент-сервер устанавливается после рукопожатия. Сервер поддерживает отдельные сокеты для каждого клиентского соединения, которые позже используются сервером для связи с этими клиентами.
Клиентский сокет, назначенный сервером, имеет сетевой поток, который он использует для связи с сервером.
Однако следующий код используется Fleck для принятия и связи с клиентами, используя только один сетевой поток, связанный с его сокетом. Я не понимаю, как каждый клиент может общаться только через сокет сервера, лежащий в основе его сетевого потока.
Вот исходный код серверного сокета.
публичный класс SocketWrapper: ISocket { частный сокет только для чтения _socket; частный поток _stream; частный CancellationTokenSource _tokenSource; частная TaskFactory _taskFactory; общедоступный SocketWrapper (сокет сокета) { _tokenSource = новый CancellationTokenSource (); _taskFactory = новая TaskFactory(_tokenSource.Token); _socket = сокет; если (_socket.Connected) _stream = новый NetworkStream(_socket); // здесь сокет сервера связан с сетевым потоком. } public Task Receive (буфер byte[], обратный вызов Action, ошибка Action, смещение целого числа) { пытаться { Func начать = (cb, s) => _stream.BeginRead(buffer, offset, buffer.Length, cb, s); // Здесь возникает проблема: почему один и тот же поток сокетов сервера используется для чтения от любого случайного клиента, который отправляет данные на сервер? Task Task = Task.Factory.FromAsync(begin, _stream.EndRead, null); Task.ContinueWith(t => обратный вызов(t.Result), TaskContinuationOptions.NotOnFaulted) .ContinueWith(t => error(t.Exception), TaskContinuationOptions.OnlyOnFaulted); Task.ContinueWith(t => error(t.Exception), TaskContinuationOptions.OnlyOnFaulted); возвратное задание; } поймать (Исключение e) { ошибка(е); вернуть ноль; } } public Task Accept (обратный вызов Action, ошибка Action) { Func end = r => _tokenSource.Token.IsCancellationRequested? null: новый SocketWrapper(_socket.EndAccept(r)); вар задача = _taskFactory.FromAsync(_socket.BeginAccept, end, null); Task.ContinueWith(t => обратный вызов(t.Result), TaskContinuationOptions.OnlyOnRanToCompletion) .ContinueWith(t => error(t.Exception), TaskContinuationOptions.OnlyOnFaulted); Task.ContinueWith(t => error(t.Exception), TaskContinuationOptions.OnlyOnFaulted); возвратное задание; } общедоступная отправка задачи (буфер byte[], обратный вызов действия, ошибка Action) { если (_tokenSource.IsCancellationRequested) вернуть ноль; пытаться { Func начать = (cb, s) => _stream.BeginWrite(buffer, 0, buffer.Length, cb, s); // Как сервер может отправить сообщение какому-либо конкретному клиенту, используя собственный сетевой поток?? Задача Task = Task.Factory.FromAsync(begin, _stream.EndWrite, null); Task.ContinueWith(t => callback(), TaskContinuationOptions.NotOnFaulted) .ContinueWith(t => error(t.Exception), TaskContinuationOptions.OnlyOnFaulted); Task.ContinueWith(t => error(t.Exception), TaskContinuationOptions.OnlyOnFaulted); возвратное задание; } поймать (Исключение e) { ошибка(е); вернуть ноль; } } } Пытался прочитать в MSDN о том, как взаимодействуют сервер и клиент, но не смог понять тот факт, о котором пытался спросить.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему я получаю разное поведение между сокетами Java и сокетами AsyncIO? [закрыто]
Anonymous » » в форуме JAVA - 0 Ответы
- 8 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Можно ли иметь более одного клиента, подключающегося к серверу Python BLE сразу?
Anonymous » » в форуме Python - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Java – использование DataInputStream с сокетами, с буферизацией или нет?
Anonymous » » в форуме JAVA - 0 Ответы
- 14 Просмотры
-
Последнее сообщение Anonymous
-