Введение
адрес гитхаба
Оригинальный пост в блоге
В этой статье используется go для реализации чата с несколькими людьми.Writing a Chat Server in Go, нажмите для просмотракитайская версия перевода.
Особенность данной работы в том, что исходный проект разбит на несколько этапов снизу вверх, новички могут шаг за шагом реализовывать разные модули системы и постепенно осваивать соответствующие пункты знаний.исходный кодЕсть подробные комментарии, которые помогут вам реализовать соответствующий код самостоятельно, не заглядывая в исходный код.
В этой статье предполагается, что вы:
- Понимать базовый синтаксис языка go
- Понимание использования git
Выполнив этот проект, вы узнаете следующее:
- Основное использование метода Reader
- использовать
netПакет реализует tcp-сервер: прослушивает порты, устанавливает соединения, предоставляет услуги - блокировка синхронизации
- горутины и каналы
- Основное использование gob
бегать
Операционная среда: перейти 1.13.1
- Открыть
GO111MODULE,бегатьgo mod downloadУстановить зависимости - Запустите сервер:
server/cmdзапустить в каталогеgo run main.go - Запустите клиент:
tui/cmdзапустить в каталогеgo run main.go -server=localhost:3333, вы можете запускать разные клиенты в нескольких окнах
метод исследования
В этом проекте 5 ответвлений, соответствующих 4 этапам. Пять ветвей:
-
v0-template-code: код шаблона, который содержит подробные комментарии, но не реализует соответствующий метод. -
v1-protocol-reader-writer: Реализует кодирование и декодирование протокола на основе строк. -
v2-server-implementation: реализует серверную часть -
v3-client-implementation: реализует клиент -
v4-gob-protocol: использовать gob в качестве протокола связи
Соответствующие этапы:
- Реализовать протокол связи на основе строк: v0 -> v1
- Реализовать сервер: v1 -> v2
- Реализовать клиент: v2 -> v3
- Использовать gob в качестве протокола связи: v3 -> v4
Рекомендуется начинать с v0 и реализовывать каждый модуль по очереди в соответствии с содержанием комментариев. Если вы действительно запутались, вы можете проверитькод в основной веткеПолучите советы.
Введение в шаги
1. Реализуйте протокол
бегать:
git checkout v0-template-code
На этом этапе мы хотим реализовать протокол связи. TCP передает неформатированные потоки байтов, нам нужно определить формат этих строк, чтобы соответствующие команды и параметры могли быть проанализированы на клиенте и сервере.
Клиент и сервер передают строки через TCP, поэтому необходимо указать протокол для преобразования строк в команды.
Формат команды следующий:
[命令类型] [参数1] [参数2] ... [参数n]\n
Каждая команда заканчивается новой строкой.
Существует три типа команд:
-
NAME: клиент установил имя пользователя -
SEND: Клиент отправляет сообщение в чат -
MESSAGE: сервер транслирует сообщения чата другим пользователям
Например, команда клиента для отправки сообщения в чат выглядит так:
SEND somemessage\n
Команда сервера для передачи сообщений другим пользователям:
MESSAGE username somemessage\n
protocol/command.goТип команды определяется в . необходимо реализоватьprotocol/reader.goа такжеprotocol/writer.goсоответствующий метод в .
2. Реализовать сервер
бегать:
git checkout v1-protocol-reader-writer
На этом этапе мы реализуем серверную часть. Сервер принимает запрос клиента на подключение и сохраняет все подключения для отправки данных клиенту позже.
Рабочий процесс на стороне сервера:
- Слушать: запустить сервер, прослушивая порт
- Принять и обслужить: установить соединение с клиентом и обслужить его.
- Удалить: после выхода клиента из соединения удалить соединение клиента.
- Закрыть: прекратите прослушивание порта и закройте сервер.
Взаимодействие между сервером и клиентом включает в себя:
- Принимать сообщения от клиентов и транслировать их другим клиентам
- Установить имя клиента
server/server.goОпределить поведение сервера как интерфейса,server/tcp_server.goдля соответствующей реализации.
внедрить клиента
бегать:
git checkout v2-server-implementation
На этом этапе мы хотим реализовать клиент. Клиент на самом деле относительно прост, ему нужно только подключиться к серверу, а затем отправлять сообщения на сервер или получать сообщения с сервера. Эта часть работы в основном связана с реализацией пользовательского интерфейса, но я не стал ее выделять. Заинтересованные читатели могут просмотретьtui/исходный код в каталоге.
Использовать gob в качестве протокола связи
бегать:
git checkout v3-client-implementation
На этом шаге мы собираемся использовать gob в качестве протокола связи, заменив исходный протокол на основе строк. Просто нужно изменитьprotocol/reader.goа такжеprotocol/writer.goизRead()а такжеWrite()метод, включающий две группы методов выемки:NewEncoder/Encoder,NewDecoder/Decode. Это очень удобно!
Оптимизация следующего шага
Этот проект может быть дополнительно оптимизирован, и заинтересованные читатели могут отправить свой PR!
- Используйте вызовы RPC вместо вызовов TCP, таких как grpc
- Сохранение данных: позволяет людям, которые присоединятся к чату позже, видеть предыдущие записи чата, а метод хранения данных может быть закодирован с помощью gob.
- Сервер поддерживает несколько чатов
- Расширенный контент: поддержка отключения и повторного подключения, вы можете просматриватьэта статья
Использованная литература: