|
@@ -0,0 +1,40 @@
|
|
1
|
+import socket
|
|
2
|
+
|
|
3
|
+# socket.AF_INET 은 IP4v 주소체계(socket.AF_INET6 은 IP6v), socket.SOCK_STREAM은 소켓의 타입
|
|
4
|
+# socket.AF_INET와 socket.SOCK_STREAM은 디폴트 값이므로 socket.socket() 로 코드를 작성해도 된다.
|
|
5
|
+server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
6
|
+
|
|
7
|
+# bind 함수는 소켓을 특정 네트워크 인터페이스와 포트 번호에 연결하는데 사용
|
|
8
|
+# HOST는 hostname, ip address, 빈 문자열 ""이 될 수 있습니다.
|
|
9
|
+# 빈 문자열이면 모든 네트워크 인터페이스로부터의 접속을 허용합니다.
|
|
10
|
+# PORT는 1-65535 사이의 숫자를 사용할 수 있습니다.
|
|
11
|
+recv_address = ('', 9999) # 튜플
|
|
12
|
+server_socket.bind(recv_address)
|
|
13
|
+
|
|
14
|
+# 서버가 클라이언트의 접속을 허용
|
|
15
|
+server_socket.listen()
|
|
16
|
+
|
|
17
|
+# accept 함수에서 대기하다가 클라이언트가 접속하면 새로운 소켓을 리턴
|
|
18
|
+client_socket, addr = server_socket.accept()
|
|
19
|
+
|
|
20
|
+# 접속한 클라이언트의 주소입니다.
|
|
21
|
+print('Connected by', addr)
|
|
22
|
+
|
|
23
|
+# recv and send loop
|
|
24
|
+while True:
|
|
25
|
+
|
|
26
|
+ # 클라이언트가 보낸 메시지를 수신하기 위해 대기
|
|
27
|
+ data = client_socket.recv(1024)
|
|
28
|
+
|
|
29
|
+ # 빈 문자열을 수신하면 루프를 중지
|
|
30
|
+ if not data:
|
|
31
|
+ break
|
|
32
|
+
|
|
33
|
+ # 수신받은 문자열을 출력
|
|
34
|
+ print(data.decode())
|
|
35
|
+
|
|
36
|
+ # echo
|
|
37
|
+ client_socket.send(data)
|
|
38
|
+
|
|
39
|
+client_socket.close()
|
|
40
|
+server_socket.close()
|