일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 유튜브 API
- spark udf
- Airflow
- integrated gradient
- session 유지
- API Gateway
- chatGPT
- requests
- top_k
- airflow subdag
- flask
- correlation
- subdag
- 상관관계
- Retry
- grad-cam
- GCP
- BigQuery
- TensorFlow
- gather_nd
- tensorflow text
- login crawling
- GenericGBQException
- XAI
- API
- UDF
- Counterfactual Explanations
- hadoop
- 공분산
- youtube data
- Today
- Total
데이터과학 삼학년
Chat application(feat.socket) 본문
Chat application
- chat을 만들기 위해서는 서로 대화할 client와 이 둘의 대화를 이어줄 server가 필요함
- 우리가 일반적으로 대화를 나누면 소리가 공기를 통해 전달됨 → 공기의 역할을 server가 수행하는 것이라고 보면 됨
- 대화를 컨트롤하는 것이 server
client |
←→ |
server |
←→ |
client |
sender |
receiver |
- python으로 구현하기 위해서 1.server, 2.client python 파일을 만들면 됨
- low-level network program으로 대표적인 → python socket을 이용하여 구성
1. server script
- 서버는 chat에 필요한 모든 logic을 가지고 있어야함
> network communication을 위해서 첫번째로 user를 확인함
어떻게 확인을 하냐? → socket을 이용함, socket은 IP주소와 port 주소를 결합한 것을 가지고 확인함
<process>
-
Create socket
-
communicate socket
-
keep waiting for an incoming connection requests
-
connect to client
-
receice message
-
decode the destination useer and select socket
-
send message to the inteded client
-
e,f stage repeats
-
exit and terminating connection
import socket,select
port = 12345
socket_list = []
users = {}
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('',port))
server_socket.listen(5)
socket_list.append(server_socket)
while True:
ready_to_read,ready_to_write,in_error = select.select(socket_list,[],[],0)
for sock in ready_to_read:
if sock == server_socket:
connect, addr = server_socket.accept()
socket_list.append(connect)
connect.send("You are connected from:" + str(addr))
else:
try:
data = sock.recv(2048)
if data.startswith("#"):
users[data[1:].lower()]=connect
print("User " + data[1:] +" added.")
connect.send("Your user detail saved as : "+str(data[1:]))
elif data.startswith("@"):
users[data[1:data.index(':')].lower()].send(data[data.index(':')+1:])
except:
continue
server_socket.close()
2. client script
- user에 의해 실행되는 부분 → 같은 code가 다른 유저에 의해 실행됨 → 그러나 각각은 독립적인 socket을 가지고 있음 → unique한 communication channel을 가질 수 있음!
<process>
-
create a unique client socket per user
-
connect to the server with given socket address(IP+Port)
-
send and receive message
-
c stage repeats
-
close the connection
import socket
client_socket = socket.socket()
port = 12345
client_socket.connect(('127.0.0.1',port))
#recieve connection message from server
recv_msg = client_socket.recv(1024)
print(recv_msg)
#send user details to server
send_msg = raw_input("Enter your user name(prefix with #):")
client_socket.send(send_msg)
#receive and send message from/to different user/s
while True:
recv_msg = client_socket.recv(1024)
print(recv_msg)
send_msg = raw_input("Send your message in format [@user:message] ")
if send_msg == 'exit':
break;
else:
client_socket.send(send_msg)
client_socket.close()