В этом руководстве мы увидим, как создать простой сервер TCP в golang, который принимает входящие запросы от параллельных клиентов и отвечает приветственным сообщением. Мы будем использовать пакет net из стандартной библиотеки, который представляет собой набор основных пакетов, улучшающих и расширяющих язык. Нам не нужно создавать собственный пакет или загружать какой-либо сторонний.

Для использования пакета net используйте оператор импорта для импорта пакета.

import "net" 

Мы определим некоторые переменные, которые потребуются для создания tcp-соединения, и, поскольку переменные не будут меняться в будущем, мы объявим их как константы.

const (
   HOST = "localhost"
   PORT = "8080"
   TYPE = "tcp"
)

Объявленные выше константы — это HOST, который в данном случае будет localhost, номер ПОРТА, по которому мы можем получить доступ к серверу, здесь он 8080 и ТИП сети, которая будет использоваться. здесь это будет tcp.

Основная задача сервера — слушать запрос клиента, поэтому мы будем использовать функцию Listen из пакета net, чтобы создать прослушиватель, который прослушивает запрос клиента. Функция прослушивания принимает в качестве аргументов тип сети (например, tcp, tcp4 и т. д.), хост и имя порта.

listener, err := net.Listen(TYPE, HOST+":"+PORT)
if err != nil {
 log.Print("error occurred", err)
 os.Exit(1)
}

Функция Listen возвращает прослушиватель и ошибку, мы обрабатываем ошибку, если она будет. Позже нам также нужно закрыть прослушиватель, когда сервер остановлен, поэтому мы используем ключевое слово defer, чтобы закрыть прослушиватель.

defer listener.Close()

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

for {
       conn, err := listen.Accept()
       if err != nil {
           log.Print("Error accepting connection: ", err)
           os.Exit(1)
       }
       // handling incoming requests.
   }

Здесь мы принимаем запрос клиента с помощью функции Accept, которая возвращает два значения типа net.Conn и error соответственно. Мы обрабатываем ошибку, если она есть.

Для обработки любого входящего запроса мы создаем функцию handleConnection, мы обрабатываем соединения в отдельной горутине.

go handleConnection(conn)
func handleConnection(conn net.Conn) {
   buffer := make([]byte, 1024)
   if _, err := conn.Read(buffer); err != nil {
       if err == io.EOF {
           log.Println("terminating")

       }
       log.Panic("error occurred", err)
   }
   conn.Write([]byte("Hello User\r\n"))
   conn.Close()
}

В приведенной выше функции handleConnection мы передаем аргумент типа net.Conn, который мы получаем от функции Accept, и создается буфер размером 1024. для хранения поступающих данных. Данные считываются с клиента с помощью функции Чтение и сохраняются в переменной буфера. Для отправки данных клиенту мы используем функцию Write, которая записывает данные клиенту, а в конце мы закрываем соединение с помощью функции Close.

Полный исходный код вышеуказанной программы:

package main

import (
   "io"
   "log"
   "net"
)

const (
   HOST = "localhost"
   PORT = "8080"
   TYPE = "tcp"
)

func main() {
   log.Println("Simple TCP server in Go")
   listen, err := net.Listen(TYPE, HOST+":"+PORT)
   if err != nil {
       log.Panic("Failed to bind to port 8080 ", err)
   }
   defer listen.Close()

   for {
       conn, err := listen.Accept()
       if err != nil {
           log.Panic("Error accepting connection: ", err)
       }
       go handleConnection(conn)
   }
}

func handleConnection(conn net.Conn) {
   buffer := make([]byte, 1024)
   if _, err := conn.Read(buffer); err != nil {
       if err == io.EOF {
           log.Println("terminating")
       }
       log.Panic("error occurred", err)
   }
   conn.Write([]byte("Hello User\r\n"))
   conn.Close()
}

Спасибо за прочтение статьи, мы очень ценим ваши ценные отзывы.