Введение
адрес гитхаба
Оригинальный пост в блоге
В этой статье используется 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.
- Сервер поддерживает несколько чатов
- Расширенный контент: поддержка отключения и повторного подключения, вы можете просматриватьэта статья
Использованная литература: