이 튜토리얼에서는 간단하면서도 강력한 TCP/IP 서버와 클라이언트를 구축하여 네트워크 프로그래밍의 신비를 풀어보겠습니다. 애플리케이션이 네트워크를 통해 어떻게 통신하는지 궁금한 적이 있다면 이 가이드가 도움이 될 것입니다!
코드에 대해 자세히 알아보기 전에 두 컴퓨터가 대화할 때 무슨 일이 일어나는지 살펴보겠습니다.
TCP/IP: 전화 통화처럼 생각하세요
서버 및 클라이언트 역할:
tcp-chat-app/ ├── server/ │ └── server.go # Server-side logic ├── client/ │ └── client.go # Client-side logic └── main.go # Starts both server and client
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) } }
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)) } }
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])) } }
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
행정.(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!