본문 바로가기

ComputerScience/Network

Socket programming (Golang)

728x90

소켓프로그래밍에서 C, Java, Python이 사용하는 api는 유사한 키워드로 구성되어 있다.

이번에는 지난 시간 살펴본 간단한 UDP, TCP 통신을 구현하고 실행해본다.

서버가 여러 client를 지원하기 위해서는 언어가 multi-thread, non blocking socket을 지원해야 한다. 대표적으로 C/Java/Python이 이에 해당한다.

하지만 이번에는 Go라는 언어를 사용할 것이다. Go는 Go routine을 사용하는데 쉽게 말하면 light-weight threads를 사용하는 접근법이다. 더 효율적이고 쉽다고 한다.(multi-thread 와는 살짝 다르다)

python, golang으로 만든 소켓통신 프로그램은 서로 통신이 가능하다.

*참고로 go로 짠 script를 빌드하려면 go run 명령어를 사용한다.

1. UDP

1. 통신할 서버 Ip, port 정의

2. client udp socket 생성(ListenPacket), (ip):(port)를 나타내는데 둘다 생략되었기 때문에 client는 어떠한 ip, port로부터의 응답을 받는다.

3. local address를 구해서(UDPAddr) client가 사용하고 있는 ip, port를 화면에 출력한다. 

4. 사용자 Input을 받는다.

5. server_addr 객체를 만들고(ResolveUDPAddr) client socket을 통해 메시지를 전달한다. (writeTo)

6. 버퍼 크기를 설정하고 client socket을 통해 메시지를 받는다. (ReadFrom)

7. 결과 출력, 소켓 close

1. 서버 포트 정의

2. server socket 생성(ListenPacket), ip자리에 null로 비어놨기 때문에 아무 아이피나 사용한다. 반면 포트는 지정해줬다.

3. 서버가 몇번 포트에서 대기중인지 출력

4. server socket을 통해 메시지를 수신한다. (ReadFrom)

5. server socket을 통해 client에게 응답을 보내준다.(WriteTo) UDP기 때문에 수신자 address를 인자로 넣어준다.

6. 결과 출력, 소켓 close

2. TCP

1. 통신할 서버 Ip, port 정의

2. client TCP socket 생성(Dial), connection을 위해서 서버의 ip, port를 알려줘야 한다.

3. local address를 구해서(TCPAddr) client가 사용하고 있는 ip, port를 화면에 출력한다. 

4. 사용자 Input을 받는다.

5. client socket을 통해 메시지를 전달한다. (Write) 이미 connection이 설정되었기 때문에 따로 Ip, port를 알려줄 필요가 없다.

6. client socket을 통해 응답 메시지를 받는다. (Read)

7. 결과 출력, 소켓 close

1. 서버 포트 정의

2. server socket 생성(Listen), ip자리를 null로 비어놨기 때문에 아무 아이피로부터의 응답을 받는다. 단 포트는 지정해줬다.

3. 서버가 몇번 포트에서 대기중인지 출력

4. connection 요청을 accept한다.(Accept) 새로운 특정 client 전용 소켓 conn이 만들어졌다.

5. conn socket을 통해 메시지를 수신한다. (Read)

6. conn socket을 통해 client에게 응답을 보내준다.(Write

7. 결과 출력, 소켓 close

728x90
반응형