كتابه السيرفر

اول خطوه هي اننا محتاجين نبدا TCP listener علشان اي Client يقدر يكلمه

l, err := net.Listen("tcp", ":6379")
if err != nil {
    fmt.Println(err)
    return
}

بعدين هنبدا نستقبل requests

conn, err := l.Accept()
if err != nil {
    fmt.Println(err)
    return
}

defer conn.Close() // close connection once finished

بعدها هنعمل inifine loop و نستقبل commands من ال clients و نقدر نرد عليهم

for {
    buf := make([]byte, 1024)

    // read message from client
    _, err = conn.Read(buf)
    if err != nil {
        if err == io.EOF {
            break
        }
        fmt.Println("error reading from client: ", err.Error())
        os.Exit(1)
    }

    // ignore request and send back a PONG
    conn.Write([]byte("+OK\r\n"))
}

خلي بالك في اخر سطر احنا بنرد بـ Ok اي كان ال command اللي بيجيلنا من ال client.

بالتالي الكود كله هيبقي

package main

import (
	"fmt"
	"io"
	"net"
	"os"
)

func main() {
	fmt.Println("Listening on port :6379")

	// Create a new server
	l, err := net.Listen("tcp", ":6379")
	if err != nil {
		fmt.Println(err)
		return
	}

	// Listen for connections
	conn, err := l.Accept()
	if err != nil {
		fmt.Println(err)
		return
	}

	defer conn.Close()

	for {
		buf := make([]byte, 1024)

		// read message from client
		_, err = conn.Read(buf)
		if err != nil {
			if err == io.EOF {
				break
			}
			fmt.Println("error reading from client: ", err.Error())
			os.Exit(1)
		}

		// ignore request and send back a PONG
		conn.Write([]byte("+OK\r\n"))
	}
}

لو جربنا نشغل الـserver و نكلمه بـ redis-cli هنقدر نشوف الـResponse اللي متوقعينه

لاحظ هنا ان الـ port نفس رقم Redis

CLI OUTPUT

الخاتمه

كدا احنا خلصنا اول جزء و اللي فيه عملنا server يقدر اي redis client يكلمه و يستقبل منه responses.

حاليا هو ريسبونس واحد Ok. ولكن في الاجزاء الجايه هنبدا نغير ده علشان نرد علي اوامر زي set, get, hset, hset.