Если я хочу создать простой многопользовательский TCP-сервер на Java, я бы просто дождался соединений и создал другой поток, который использует пул потоков для обработки каждого из них.
Мне интересно, позволит ли этот фрагмент кода такое же поведение без явного открытия потока для каждого клиента в Dart:
ServerSocket.bind('127.0.0.1', 4041)
.then((serverSocket) {
serverSocket.listen((socket) {
socket.transform(utf8.decoder).listen(handleClient);
});
});
void handleClient(Socket socket){
// do something
}
Если нет, как мне реализовать такое поведение? Предпочтительно способом Darty
.
По умолчанию Dart использует однопоточный параллелизм. Если вы хотите, чтобы код выполнялся в другом потоке, вам нужно явно создать новый Isolate.
Dart поддерживает более одного потока, прослушивающего один и тот же IP-адрес и порт, и автоматически распределяет входящие соединения по прослушивающим потокам.
Смотрите также
В этом нет необходимости, только если вы хотите, чтобы каждый запрос обрабатывался в другом изоляте. Создание изоляторов для каждого запроса - плохая идея, поскольку изолирующий запуск выполняется медленно. Один поток может нормально обрабатывать множество запросов. Вы можете заранее запустить несколько изоляторов и позволить Dart обмениваться запросами между ними, чтобы распределять нагрузку между несколькими изоляторами.
Веб-фреймворки Aqueduct и Angel поддерживают предварительно созданные Isolates, чтобы гарантировать, что все ваши ядра могут быть задействованы.
Разве они оба не предназначены для веб-приложений? Я планирую использовать это для небольшого проекта мобильного приложения, над которым я работаю.
Компоненты на стороне сервера предоставляют API RESTful и доступ к базе данных на стороне сервера. Да, люди используют их с приложениями Flutter.
package:angel_framework
- это библиотека главного сервера, которая может использоваться сама по себе (в этом отношении и во Flutter). Более «прикладная» функциональность, такая как WebSockets, статические серверы, базы данных и т. д., Находится в отдельных дополнительных пакетах.
Значит, мне нужно открыть изолятор для каждого клиента? Вы предлагаете сделать это в функции handleClient или в Слушать?