> 백엔드 개발 > Golang > 네트워킹: Go의 첫 번째 TCP/IP 서버 및 클라이언트

네트워킹: Go의 첫 번째 TCP/IP 서버 및 클라이언트

Barbara Streisand
풀어 주다: 2024-11-30 15:51:13
원래의
251명이 탐색했습니다.

Networking : Your First TCP/IP Server and Client in Go

? 우리가 배울 내용

이 튜토리얼에서는 간단하면서도 강력한 TCP/IP 서버와 클라이언트를 구축하여 네트워크 프로그래밍의 신비를 풀어보겠습니다. 애플리케이션이 네트워크를 통해 어떻게 통신하는지 궁금한 적이 있다면 이 가이드가 도움이 될 것입니다!

? 전제 조건

  • Go 기본 프로그래밍 지식
  • 네트워킹에 대한 호기심
  • 텍스트 편집기
  • 컴퓨터에 설치하세요
  • Go 모듈이 추가되었습니다(go mod init tcpIp 사용)

? 네트워크 통신 이해

코드에 대해 자세히 알아보기 전에 두 컴퓨터가 대화할 때 무슨 일이 일어나는지 살펴보겠습니다.

  1. TCP/IP: 전화 통화처럼 생각하세요

    • TCP(전송 제어 프로토콜): 메시지가 완전하고 순서대로 전달되도록 보장
    • IP(인터넷 프로토콜): 메시지를 올바른 장치로 라우팅하는 데 도움
  2. 서버 및 클라이언트 역할:

    • 서버: 들어오는 연결을 기다리고 수신합니다
    • 클라이언트: 연락을 시작하고 요청을 보냅니다

?️ 프로젝트 구조

tcp-chat-app/
├── server/
│   └── server.go   # Server-side logic
├── client/
│   └── client.go   # Client-side logic
└── main.go         # Starts both server and client
로그인 후 복사

? 1단계: 서버 생성

서버 코드 이해

package server

import (
    "log"
    "net"
)

// StartServer: Our digital receptionist 
func StartServer() {
    // Choose a "phone number" (address)
    address := "localhost:8080"

    // Set up a "phone line" to listen for calls
    listener, err := net.Listen("tcp", address)
    if err != nil {
        log.Fatalf("Couldn't set up the phone line: %v", err)
    }
    defer listener.Close()

    log.Printf("Server is ready, waiting for connections on %s", address)

    // Forever wait for incoming "calls"
    for {
        // Accept a new connection
        conn, err := listener.Accept()
        if err != nil {
            log.Printf("Missed a call: %v", err)
            continue
        }

        // Handle each "caller" in a separate conversation
        go handleClient(conn)
    }
}
로그인 후 복사

주요 개념 설명

  • net.Listen(): 연결을 수신하기 위한 네트워크 "소켓"을 생성합니다
  • Listener.Accept(): 들어오는 연결을 기다리고 수락합니다
  • go handlerClient(conn): 별도의 스레드(goroutine)에서 각 클라이언트를 처리합니다

? 클라이언트 연결 처리

func handleClient(conn net.Conn) {
    // Always clean up after the conversation
    defer conn.Close()

    log.Printf("New client connected: %s", conn.RemoteAddr())

    // Prepare a message buffer
    buffer := make([]byte, 1024)

    // Keep the conversation going
    for {
        // Read message from client
        n, err := conn.Read(buffer)
        if err != nil {
            log.Printf("Connection error: %v", err)
            return
        }

        // Echo the message back
        message := string(buffer[:n])
        log.Printf("Received: %s", message)
        conn.Write([]byte("Server says: " + message))
    }
}
로그인 후 복사

여기서 무슨 일이 일어나고 있나요?

  • 버퍼: 수신 메시지를 위한 임시 저장소
  • conn.Read(): 클라이언트로부터 메시지를 받습니다
  • conn.Write(): 클라이언트에게 메시지를 다시 보냅니다

?️ 2단계: 클라이언트 생성

package client

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

func StartClient() {
    // Dial the server (like making a phone call)
    conn, err := net.Dial("tcp", "localhost:8080")
    if err != nil {
        log.Printf("Could not connect to server: %v", err)
        return
    }
    defer conn.Close()

    fmt.Println("Connected to server. Start chatting!")

    // Read user input and send to server
    scanner := bufio.NewScanner(os.Stdin)
    for {
        fmt.Print("> ")
        if !scanner.Scan() {
            break
        }

        message := scanner.Text()
        if message == "exit" {
            break
        }

        // Send message to server
        conn.Write([]byte(message + "\n"))

        // Wait for server's response
        response := make([]byte, 1024)
        n, err := conn.Read(response)
        if err != nil {
            log.Printf("Error receiving response: %v", err)
            break
        }

        fmt.Println(string(response[:n]))
    }
}
로그인 후 복사

클라이언트 역학

  • net.Dial(): 서버에 연결
  • scanner.Scan(): 사용자의 키보드 입력 읽기
  • conn.Write(): 서버에 메시지 보내기
  • conn.Read(): 서버의 응답을 받습니다

? 모든 것을 하나로 모으기: main.go

package main

import (
    "time"
    "tcpIp/server"
    "tcpIp/client"
)

func main() {
    // Start server in background
    go func() {
        server.StartServer()
    }()

    // Give server a moment to start
    time.Sleep(time.Second)

    // Launch client
    client.StartClient()
}
로그인 후 복사

?‍♂️ 네트워크 앱 실행

go run main.go
로그인 후 복사

? 당신이 배운 것

  1. 기본적인 네트워크 통신 개념
  2. Go에서 TCP 서버 만들기
  3. 서버에 클라이언트 연결
  4. 네트워크 연결을 안전하게 처리
  5. 네트워크 프로그래밍의 기본 오류 관리

? 잠재적인 개선

  • 인증
  • 다중 클라이언트 지원
  • 강력한 오류 처리
  • 암호화

? 자원

  • Go의 넷 패키지 문서
  • TCP/IP 프로토콜 기본
  • Go에서의 동시 프로그래밍

참고자료

행정.(2023년 8월 9일). 모두를 위한 무료 스위칭 및 라우팅 가이드를 통해 TCP/IP를 알아보세요. 커신. https://cursin.net/en/learn-tcp-ip-with-the-free-switching-and-routing-guide-for-everyone/

우드벡, A.(2021). Go를 사용한 네트워크 프로그래밍. 노스타치프레스

행복한 네트워킹! ??

위 내용은 네트워킹: Go의 첫 번째 TCP/IP 서버 및 클라이언트의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿