Эта статья является продолжением предыдущей статьи, в которой мы видели, как создать сервер 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)
}
}
Спасибо за прочтение статьи, оставляйте свои ценные отзывы в комментариях.