반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
👨💻 안녕하세요, 윌리 프로젝트의 윌리 입니다.
Go 에서 TCP/IP 통신을 하기위한 방법은 무엇이 있는지 간략히 알아보았습니다.
질문 >
Go 에서 TCP/IP 통신을 하기위한 방법은 무엇이 있나요?
답변 >
Go에서 TCP/IP 통신을 구현하려면 표준 라이브러리인 net 패키지를 사용합니다. 이 패키지는 TCP/IP 기반의 네트워크 연결을 설정하고, 데이터 송수신을 처리하기 위한 다양한 함수와 인터페이스를 제공합니다.
TCP/IP 통신의 주요 구성 요소
- 서버 (Server):
- 클라이언트의 연결 요청을 수락하고 데이터를 처리합니다.
- 클라이언트 (Client):
- 서버에 연결 요청을 보내고 데이터를 송수신합니다.
Go에서 TCP 서버 구현
기본 TCP 서버
다음은 간단한 TCP 서버 구현 예제입니다.
package main
import (
"bufio"
"fmt"
"net"
)
func main() {
// 서버가 8080 포트에서 대기
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Error starting server:", err)
return
}
defer listener.Close()
fmt.Println("Server is running on port 8080...")
for {
// 클라이언트 연결 수락
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting connection:", err)
continue
}
// 연결 처리
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
defer conn.Close()
// 클라이언트로부터 데이터 수신
reader := bufio.NewReader(conn)
for {
message, err := reader.ReadString('\\n')
if err != nil {
fmt.Println("Connection closed:", err)
return
}
fmt.Printf("Received: %s", message)
// 응답 보내기
conn.Write([]byte("Message received\\n"))
}
}
Go에서 TCP 클라이언트 구현
기본 TCP 클라이언트
다음은 간단한 TCP 클라이언트 구현 예제입니다.
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
// 서버에 연결
conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Println("Error connecting to server:", err)
return
}
defer conn.Close()
fmt.Println("Connected to server")
// 사용자 입력 처리
for {
fmt.Print("Enter message: ")
input, _ := bufio.NewReader(os.Stdin).ReadString('\\n')
// 서버로 데이터 전송
_, err := conn.Write([]byte(input))
if err != nil {
fmt.Println("Error sending data:", err)
return
}
// 서버로부터 응답 수신
response, err := bufio.NewReader(conn).ReadString('\\n')
if err != nil {
fmt.Println("Error receiving response:", err)
return
}
fmt.Printf("Server response: %s", response)
}
}
서버와 클라이언트의 실행
- 먼저 서버를 실행합니다.
go run server.go
- 클라이언트를 실행하여 서버에 연결합니다.
go run client.go
- 클라이언트에서 메시지를 입력하면, 서버가 이를 수신하고 응답을 보냅니다.
고급 TCP/IP 통신 기능
1. 다중 연결 처리
- Go의 고루틴을 활용하여 서버에서 여러 클라이언트 연결을 동시에 처리할 수 있습니다.
- 위의 예제에서 handleConnection 함수는 고루틴으로 실행됩니다.
2. 네트워크 프로토콜
- TCP를 기반으로 더 복잡한 프로토콜(HTTP, MQTT 등)을 구현할 수 있습니다.
- 또는 기존 프로토콜(예: http 패키지)을 활용할 수 있습니다.
3. TLS 보안
- crypto/tls 패키지를 사용해 TLS를 적용하면 TCP 통신을 암호화할 수 있습니다.
- 안전한 통신이 필요한 경우 TLS 적용은 필수적입니다.
예제: TLS 서버
package main
import (
"crypto/tls"
"fmt"
"log"
)
func main() {
cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
if err != nil {
log.Fatal(err)
}
config := &tls.Config{Certificates: []tls.Certificate{cert}}
listener, err := tls.Listen("tcp", ":8443", config)
if err != nil {
log.Fatal(err)
}
defer listener.Close()
fmt.Println("TLS server is running on port 8443...")
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting connection:", err)
continue
}
go handleTLSConnection(conn)
}
}
func handleTLSConnection(conn net.Conn) {
defer conn.Close()
fmt.Println("Secure connection established")
conn.Write([]byte("Hello, secure world!\\n"))
}
4. 비동기 통신 및 메시지 브로커
- TCP를 활용한 메시지 큐나 브로커를 구현할 수 있습니다.
- 예를 들어, 클라이언트 간의 메시지를 교환하는 기능을 추가할 수 있습니다.
에러 처리와 디버깅 팁
- 네트워크 에러 로그:
- 연결 오류, 수신/전송 오류는 항상 로그를 남기도록 구현합니다.
- 연결 제한:
- listener에 연결 제한을 설정하거나 select를 활용해 특정 조건에서 연결을 거부합니다.
- 타임아웃 설정:
- net.Conn의 SetDeadline, SetReadDeadline, SetWriteDeadline 메서드를 사용해 타임아웃을 설정합니다.
결론
Go에서 TCP/IP 통신은 net 패키지 덕분에 간단하고 직관적으로 구현할 수 있습니다. 서버와 클라이언트 간의 안정적인 통신을 위해 다음을 고려하세요:
- 고루틴을 사용한 동시성 처리.
- TLS를 사용한 보안 강화.
- 타임아웃 및 에러 처리 추가.
이를 활용해 실시간 메시징, 데이터 스트리밍, IoT 장치 간 통신 등 다양한 네트워크 애플리케이션을 구현할 수 있습니다.
🎬 유튜브 채널 🎬
위로그@WiLog
📢 안녕하세요, 위로그@WiLog 시청자 여러분, 저는 윌리(Willee) 입니다. 📢 위로그@WiLog 는 자기계발을 목적으로 하는 채널 입니다. 📢 오늘도 즐겁게~ 자신을 위한 계발을 함께 해보아요~ d^_^b 📌
www.youtube.com
🎬 치지직 채널 🎬
위로그 채널 - CHZZK
지금, 스트리밍이 시작됩니다. 치지직-
chzzk.naver.com
반응형
'프로그래밍' 카테고리의 다른 글
👨💻 [Go] Go 에서 net 패키지와 gnet 패키지 를 비교하면, 장단점은 어떻게 되나요? (0) | 2025.01.06 |
---|---|
👨💻 [Go] Go 에서 gnet 패키지는 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.06 |
👨💻 [Go] Go 에서 제공하는 유용한 도구(명령어) 는 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.06 |
👨💻 [Go] Go 에서 map 이란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.06 |
👨💻 [Go] Go 에서 기저 배열(underlying array) 이란 무엇이며, 어떻게 활용할 수 있나요? (0) | 2025.01.06 |