728x90
반응형
chapter 6에서 upd 서버와 클라이언트 프로그램에 대해 공부했으니, 코드를 예시로 작성해봤다.
먼저 server.go
package main
import (
"fmt"
"log"
"net"
)
func handleUDPConnection(conn *net.UDPConn) {
buffer := make([]byte, 1024)
// udp connection으로 부터 값을 읽어들인다.
n, addr, err := conn.ReadFromUDP(buffer)
if err != nil {
log.Fatal(err)
}
// 리턴 값은 전달 받은 클라이언트 서버의 address, msg
fmt.Println("UDP client : ", addr)
fmt.Println("Received from UDP client : ", string(buffer[:n]))
// 클라이언트로 msg write
msg := []byte("Hello UDP Client")
_, err = conn.WriteToUDP(msg, addr)
if err != nil {
log.Fatal(err)
}
}
func main() {
// 첫 번째 파라미터에는 udp 값을, 두 번째 파라미터에는 ip와 port 번호를 전달
// 반환 값으로 udp의 endpoint를 전달한다.
udpAddr, err := net.ResolveUDPAddr("udp4", "localhost:6000")
if err != nil {
log.Fatal(err)
}
// udp endpoint를 파라미터로 넘기면 udp connection을 리턴한다.
listen, err := net.ListenUDP("udp", udpAddr)
if err != nil {
log.Fatal(err)
}
// listen하고 있는 상태
fmt.Println("UDP server up and listening on port 6000")
defer listen.Close()
for {
handleUDPConnection(listen)
}
}
UDP 소켓은 연결과 해제의 과정이 없음으로 위와 같은 코드를 작성한다.
서버에서는 연결이 들어오면 클라이언트 서버에서 보낸 메시지를 읽고, 그 서버로 다시 응답 메시지를 전송하고 있다.
client.go
package main
import (
"fmt"
"log"
"net"
)
func main() {
// client 프로그램이기 때문에, server쪽의 udp endpoint를 remoteAddr 변수로 생성
remoteAddr, err := net.ResolveUDPAddr("udp", "localhost:6000")
if err != nil {
log.Fatal(err)
}
// 생성한 remoteAddr로 dial, 이때 local address 자동 할당 되기 때문에 nil 값으로 넘겨도 무방하다.
conn, err := net.DialUDP("udp", nil, remoteAddr)
if err != nil {
log.Fatal(err)
}
// 각각 주소 확인
log.Println("Remote UDP addr : ", conn.RemoteAddr().String())
log.Println("Local UDP client address : ", conn.LocalAddr().String())
defer conn.Close()
// udp connection을 통해 server 프로그램으로 메시지 write
msg := []byte("Hello UDP Server!")
_, err = conn.Write(msg)
if err != nil {
log.Fatal(err)
}
// server에서 전송한 msg read 후 프로그램 종료
buf := make([]byte, 1024)
n, addr, err := conn.ReadFromUDP(buf)
fmt.Println("UDP Server : ", addr)
fmt.Println("Received from UDP server : ", string(buf[:n]))
}
서버는 for 문 안에서 connection을 유지하고 있지만,
클라이언트 프로그램에서는 메시지를 전송하고 다시 답장을 받으면 종료되게끔 만들어져 있다.
실행 결과는 아래와 같다.
클라이언트 프로그램의 ip, port를 지정해주지 않았음에도 자동 할당 된 것을 확인할 수 있다.
728x90
반응형
'Golang > etc' 카테고리의 다른 글
tcp/ip -08 DNS (0) | 2022.07.06 |
---|---|
tcp/ip - 07 소켓의 종료 (0) | 2022.07.04 |
tcp/ip 05 (0) | 2022.07.03 |
tcp/ip 04 (0) | 2022.06.28 |
tcp/ip -02,03 (0) | 2022.06.27 |