๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Lang/๐Ÿ Python

๐Ÿ Python * socket ์—ฐ๊ฒฐ + ๋ฌธ์ž์—ด ์ „์†ก

 

SERVER

1. ๋จผ์ € ํ†ต์‹ ํ•  ์†Œ์ผ“์˜ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 class SocketInfo() :
    HOST='' 
    #HOST์— ์•„๋ฌด๊ฒƒ๋„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    
    PORT=1024
    #๋‘ ๋””๋ฐ”์ด์Šค๊ฐ€ ๋งŒ๋‚  ์ง€์ ์„ ์ •ํ•ด์ค€๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•  ๊ฒƒ ๊ฐ™๋‹ค.
    #ํฌํŠธ๋ฒˆํ˜ธ๋Š” ์•„๋ฌด๊ฑฐ๋‚˜ ํ•ด๋„ ์ƒ๊ด€์—†์œผ๋‚˜ ์ด๋ฏธ ์ •ํ•ด์ ธ ์žˆ๋Š” ํฌํŠธ๋ฒˆํ˜ธ๋Š” ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
    # HTTP, FTP ๋“ฑ์˜ ์ง€์ • ํฌํŠธ๋ฒˆํ˜ธ ์‚ฌ์šฉ ๋ถˆ๊ฐ€
    
    BUFSIZE=1024
    #์†Œ์ผ“์ด ํ•œ๋ฒˆ์— ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋Š” ์šฉ๋Ÿ‰์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.
    #์ตœ๋Œ€ 1024 byte๊นŒ์ง€๋งŒ ์ „๋‹ฌ ๋ฐ›๊ฒ ๋‹ค.

    ADDR=(HOST, PORT)
    #ํ›„์— server์—์„œ bind ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ bind ํ•จ์ˆ˜์˜ ์ธ์ž ๊ฐ’์ด ( IP, PORT ) ์ด๊ธฐ ๋•Œ๋ฌธ์—
    #๊ทธ๋ƒฅ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ค€ ๊ฒƒ์ด๋‹ค.

ํŒŒ์ผ๋กœ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š์œผ์‹œ๊ณ  ํ•œ ํŒŒ์ผ์— ๊ฐ™์ด ๋„ฃ์œผ์…”๋„ ๋ฉ๋‹ˆ๋‹ค.

์ €๋Š” ๋”ฐ๋กœ ๋†”๋‘๋Š”๊ฒŒ ๋ณด๊ธฐ ํŽธํ•ด์„œ ๋ถ„๋ฆฌํ–ˆ์–ด์š”.

2. Server์˜ ์†Œ์ผ“์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

# -*- coding:utf-8 -*-
#ํ•œ๊ธ€์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์Œ์œผ๋กœ ์ธ์ฝ”๋”ฉ์„ ์‹œ์ผœ์ฃผ๋Š” ๋ช…๋ น์ด๋‹ค.
#ํ•œ๊ธ€์ฃผ์„์„ ๋‹ค๋Š”๋ฐ๋„ ์—†์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.


from socket import *
#์†Œ์ผ“์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์†Œ์ผ“ ๋ชจ๋“ˆ์„ importํ•œ๋‹ค.
from data_file import *
#์†Œ์ผ“์˜ ๊ตฌ์กฐ์ •๋ณด๋ฅผ ๋‹ด์•„๋†“์€ ํŒŒ์ผ์„ importํ•œ๋‹ค.

ssock=socket(AF_INET, SOCK_STREAM)
ssock.bind(SocketInfo.ADDR)
ssock.listen(5)
#์„œ๋ฒ„ ์†Œ์ผ“์ด ํด๋ผ์ด์–ธํŠธ์˜ ์ ‘์†์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. (listen socket ์ƒํƒœ)
csock=None

while True :
    if csock is None :
    #์—ฐ๊ฒฐ๋œ client ์†Œ์ผ“์ด ์—†์œผ๋ฉด ์‹คํ–‰ํ•œ๋‹ค.
        print "waiting for connection..."
        csock, addr_info = ssock.accept()
        #client์—์„œ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๋ฉด ssock.accpet() ์‹คํ–‰ ํ›„ ๋ฐ˜ํ™˜ ๋˜๋Š” ๊ฐ’์„ ๊ฐ๊ฐ csock, addr_info์— ์ €์žฅํ•œ๋‹ค.
        print "got connection from", addr_info

    else:
    #์—ฐ๊ฒฐ๋œ client ์†Œ์ผ“์ด ์žˆ์œผ๋ฉด ์‹คํ–‰ํ•œ๋‹ค.
        print "waiting for response..."
        commend=csock.recv(SocketInfo.BUFSIZE)
        #client์—์„œ ์‘๋‹ต์„ ๋Œ๋ ค์ฃผ๋ฉด BUFSIZE๋งŒํผ ๋ฐ›์•„๋“œ๋ ค commend์— ์ €์žฅํ•œ๋‹ค.
        print "accept >> "+commend

        if commend=="hi" :
            csock.send("Hello")

        elif commend=="exit" :
            csock.send("bye")
            csock.close()
            #์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” client csock์„ ๋‹ซ๋Š”๋‹ค. ( server์™€ client์˜ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง„๋‹ค. )
            print "close csock"

        else:
            csock.send("bye")
            csock.close()
            #์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” client csock์„ ๋‹ซ๋Š”๋‹ค. ( server์™€ client์˜ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง„๋‹ค. )
            print "close csock"

 

 

 

CLIENT

Client ์†Œ์ผ“์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 # -*- coding:utf-8 -*-

from socket import  *
from sys import exit
#ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•˜๋Š” exit()ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ์„ ์œ„ํ•ด sys ๋ชจ๋“ˆ์˜ exit๋ฅผ importํ•œ๋‹ค.
from data_file import SocketInfo
#์†Œ์ผ“์˜ ๊ตฌ์กฐ์ •๋ณด๋ฅผ ๋‹ด์•„๋†“์€ ํŒŒ์ผ์„ importํ•œ๋‹ค.

class SocketInfo(SocketInfo) :
    HOST='127.0.0.1'

csock=socket(AF_INET, SOCK_STREAM)
#IPv4, TCP ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ์†Œ์ผ“์„ ์ƒ์„ฑํ•œ๋‹ค.
csock.connect(SocketInfo.ADDR)
#ADDR์— ํ•ด๋‹นํ•˜๋Š” IP์™€ PORT๋ฅผ ๊ฐ€์ง„ ์†Œ์ผ“์— ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•œ๋‹ค. ( server์™€ client๊ฐ€ ์—ฐ๊ฒฐ๋˜์—ˆ๋‹ค. )

while True:
    try:
    #์˜ˆ์™ธ์ฒ˜๋ฆฌ, ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์‹คํ–‰ํ•œ๋‹ค.
        commend=raw_input(" >> ")
        #commend ๋ณ€์ˆ˜์— ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ๋ฐ›์•„ ์ €์žฅํ•œ๋‹ค.
        csock.send(commend)
        #csock์„ ์ด์šฉํ•˜์—ฌ commend๋ฌธ์ž์—ด์„ ์ „์†กํ•œ๋‹ค.
        print "waiting for response..."
        commend=csock.recv(SocketInfo.BUFSIZE)
        #commend์— csock์„ ์ด์šฉํ•˜์—ฌ server๋กœ ๋Œ๋ ค๋ฐ›์€ ์‘๋‹ต์„ BUFSIZE ๋งŒํผ ๋ฐ›์•„์„œ ์ €์žฅํ•œ๋‹ค.
        print commend

    except Exception as e :
    #์˜ˆ์™ธ์ฒ˜๋ฆฌ, ์—๋Ÿฌ๊ฐ€ ๋‚  ๊ฒฝ์šฐ ์‹คํ–‰ํ•œ๋‹ค.
        print "%s:%s" %(e, SocketInfo.ADDR)
        csock.close()
        #์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” client csock์„ ๋‹ซ๋Š”๋‹ค. ( server์™€ client์˜ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง„๋‹ค. )
        exit()
        #ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.

    print "connect is success"

 

 

 

Let's Do it

Server์™€ Client๋ฅผ ์‹คํ–‰ํ•˜๊ณ , Client์— hi๋ฅผ ์ž…๋ ฅํ•ด๋ด…๋‹ˆ๋‹ค.