데이터과학 삼학년

Chat application(feat.socket) 본문

카테고리 없음

Chat application(feat.socket)

Dan-k 2020. 1. 10. 12:11
반응형

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>

  1. Create socket

  2. communicate socket

  3. keep waiting for an incoming connection requests

  4. connect to client

  5. receice message

  6. decode the destination useer and select socket

  7. send message to the inteded client

  8. e,f stage repeats

  9. 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>

  1. create a unique client socket per user

  2. connect to the server with given socket address(IP+Port)

  3. send and receive message

  4. c stage repeats

  5. 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()

 

image source : https://www.kodefork.com/articles/client-and-server-chatting-application-in-python/

728x90
반응형
LIST
Comments