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

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

import "net" 

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

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

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

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

func checkErr(err error, msg string) {
   if err != nil {
       fmt.Println("error: ", msg, " ", err)
       os.Exit(1)
   }
}

Для подключения к нужному серверу мы используем функцию Dial из пакета net, которая принимает два аргумента: первый — тип сети, а второй — адрес. Функция Dial возвращает net.Conn и ошибку, мы обрабатываем ошибку в отдельной функции checkErr. Мы используем ключевое слово defer, чтобы закрыть соединение, когда программа завершается.

conn, err := net.Dial(TYPE, HOST+":"+PORT)
defer conn.Close()
checkErr(err, "Unable to connect")

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

buf := make([]byte, 1024)
_, err = conn.Read(buf)
checkErr(err, "Error reading data")
fmt.Println(string(buf))

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

msgReader := bufio.NewReader(os.Stdin)
fmt.Print("Enter your text: ")
msg, _ := msgReader.ReadString('\n')

После получения сообщения мы используем функцию Write для отправки сообщения на сервер.

conn.Write([]byte(msg))

Вот полный код для того же самого.

package main

import (
   "bufio"
   "fmt"
   "net"
   "os"
)

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

func main() {
   fmt.Println("!! TCP Client in golang !!")

   conn, err := net.Dial(TYPE, HOST+":"+PORT)
   defer conn.Close()
   checkErr(err, "Unable to connect")

   buf := make([]byte, 1024)
   _, err = conn.Read(buf)
   checkErr(err, "Error reading data")
   fmt.Println(string(buf))

   for {
       msgReader := bufio.NewReader(os.Stdin)
       fmt.Print("Enter your text: ")
       msg, _ := msgReader.ReadString('\n')
       conn.Write([]byte(msg))
   }
}

func checkErr(err error, msg string) {
   if err != nil {
       fmt.Println("error: ", msg, " ", err)
       os.Exit(1)
   }
}

Спасибо за прочтение статьи, оставляйте свои ценные отзывы в комментариях.