📈【Практика】Создайте простой чат для нескольких человек

Go

Введение

адрес гитхаба
Оригинальный пост в блоге

В этой статье используется go для реализации чата с несколькими людьми.Writing a Chat Server in Go, нажмите для просмотракитайская версия перевода.

Особенность данной работы в том, что исходный проект разбит на несколько этапов снизу вверх, новички могут шаг за шагом реализовывать разные модули системы и постепенно осваивать соответствующие пункты знаний.исходный кодЕсть подробные комментарии, которые помогут вам реализовать соответствующий код самостоятельно, не заглядывая в исходный код.

В этой статье предполагается, что вы:

  • Понимать базовый синтаксис языка go
  • Понимание использования git

Выполнив этот проект, вы узнаете следующее:

  • Основное использование метода Reader
  • использоватьnetПакет реализует tcp-сервер: прослушивает порты, устанавливает соединения, предоставляет услуги
  • блокировка синхронизации
  • горутины и каналы
  • Основное использование gob

бегать

Операционная среда: перейти 1.13.1

  1. ОткрытьGO111MODULE,бегатьgo mod downloadУстановить зависимости
  2. Запустите сервер:server/cmdзапустить в каталогеgo run main.go
  3. Запустите клиент:tui/cmdзапустить в каталогеgo run main.go -server=localhost:3333, вы можете запускать разные клиенты в нескольких окнах

метод исследования

В этом проекте 5 ответвлений, соответствующих 4 этапам. Пять ветвей:

  1. v0-template-code: код шаблона, который содержит подробные комментарии, но не реализует соответствующий метод.
  2. v1-protocol-reader-writer: Реализует кодирование и декодирование протокола на основе строк.
  3. v2-server-implementation: реализует серверную часть
  4. v3-client-implementation: реализует клиент
  5. v4-gob-protocol: использовать gob в качестве протокола связи

Соответствующие этапы:

  1. Реализовать протокол связи на основе строк: v0 -> v1
  2. Реализовать сервер: v1 -> v2
  3. Реализовать клиент: v2 -> v3
  4. Использовать 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

На этом этапе мы реализуем серверную часть. Сервер принимает запрос клиента на подключение и сохраняет все подключения для отправки данных клиенту позже.

Рабочий процесс на стороне сервера:

  1. Слушать: запустить сервер, прослушивая порт
  2. Принять и обслужить: установить соединение с клиентом и обслужить его.
  3. Удалить: после выхода клиента из соединения удалить соединение клиента.
  4. Закрыть: прекратите прослушивание порта и закройте сервер.

Взаимодействие между сервером и клиентом включает в себя:

  1. Принимать сообщения от клиентов и транслировать их другим клиентам
  2. Установить имя клиента

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!

  1. Используйте вызовы RPC вместо вызовов TCP, таких как grpc
  2. Сохранение данных: позволяет людям, которые присоединятся к чату позже, видеть предыдущие записи чата, а метод хранения данных может быть закодирован с помощью gob.
  3. Сервер поддерживает несколько чатов
  4. Расширенный контент: поддержка отключения и повторного подключения, вы можете просматриватьэта статья

Использованная литература: