E D R , A S I H C RSS

Python Network Programming


Python —„œ๋Š” ๊ธฐ๋ณธ œผ๋กœ Socket Library ๋ฅผ  œ๊ณต•ดค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  async i/o ๋ชจ๋“ˆธ medusa ๊ฐ€ ด œ๋Š” ๊ธฐ๋ณธœผ๋กœ  œ๊ณต๋œ๋‹ค.

๋งŒผ winsock „ “ฐ๊ณ  ‹ถ๋‹ค๋ฉด windows extension libary ๋“ค„ „น˜•ดฃผ๋ฉด ๋œ๋‹ค.

1. TCP Socket

1.1. Client

~cpp
from socket import *
host = "localhost"
port = 9000
addr = (host, port)
sock = socket(AF_INET, SOCK_STREAM)
sock.connect(addr)
sock.send("TEST")
sock.close

1.2. Server

~cpp
from socket import *
port = 9010
bufsize = 1024
maximumConnection = 5
sock = socket(AF_INET, SOCK_STREAM)
sock.bind(("localhost",port))
sock.listen(maximumConnection)
while 1:
    newsock, client_addr = sock.accept()
    print "Client connected:",client_addr
    data = newsock.recv(bufsize)
    print data

2. UDP Socket

~cpp
#server.py
from socket import *
host = "localhost"
port = 1005
buf = 1024
addr = (host, port)
UDPSock = socket(AF_INET, SOCK_DGRAM)
UDPSock.bind(addr)
while 1:
    data, addr = UDPSock.recvfrom(buf)
    if not data:
        print "Client has exited!"
        break
    else:
        print "\n Received message '", data,"'"
UDPSock.close()        

#client.py 
from socket import *
host = "localhost"
port = 1005
buf = 1024
addr = (host, port)
UDPSock = socket(AF_INET, SOCK_DGRAM)
def_msg = "==Enter message to send to server=="
print "\n", def_msg
while(1):
    data = raw_input('>> ')
    if not data:
        break
    else:
        if(UDPSock.sendto(data,addr)):
            print "Sending message '",data,"'..."
UDPSock.close()

3. normal socket

—ญ‹œ. •„ฃผ•„ฃผ ๊ฐ„๋‹จ•œ ˜ˆ œ.~


~cpp 
from socket import *
from threading import *

class ListenThread(Thread):
    def __init__(self, aServer):
        Thread.__init__(self)
        self.server=aServer
    def run(self):
        clientConnection, address = self.server.listenSock.accept()
        print address
        clientConnection.send("hahaharn")
        clientConnection.close()
        self.server.listenSock.close()

class Server:
    def serve(self, aPort):
        self.listenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)
        here=('',aPort)
        self.listenSock.bind(here)
        self.listenSock.listen(5)
        listenThread=ListenThread(self)
        listenThread.start()

if __name__=="__main__":
    server = Server()
    server.serve(30002)

๋˜๋Š”, ๊ธฐ๋ณธ ๋ชจ๋“ˆ๋กœ žˆ๋Š” SocketServer ๋ชจ๋“ˆ„ ‚ฌšฉ•  ˆ˜ žˆ๋‹ค. ๋‹คŒ€ ๊ฐ„๋‹จ•œ ˜ˆ œ.
~cpp 
from SocketServer import *
HOST = ('', 7000)
ClientList = []
ClientConnections = []

class MyServer (BaseRequestHandler):
    def broadcast (self, msg):
        for conn in ClientConnections:
            conn.send (msg)
                    
    def handle(self):
        conn = self.request
        if conn:
            peername = conn.getpeername ()
            ClientList.append (peername)
            ClientConnections.append (conn)
            print "Requested by ", peername

        try:
            cmd = raw_input (">> ")
            while cmd:
                if cmd == 'ls':
                    print "== Connected Client Lists =="
                    print ClientList
                    self.broadcast ("ls command inputed...n")
                cmd = raw_input (">> ")

        except:
            print "Socket Error occured.."
            return

if __name__ == '__main__':
    my_server = ThreadingTCPServer (HOST, MyServer)
    my_server.serve_forever ()

4. Medusa

Medusa ๋Š” ๋‚ด๋ถ€ œผ๋กœ select / poll ๋ฅผ ดšฉ, ๋น„๋™๊ธฐ †Œผ“๋ถ€๋ถ„„ ๊ตฌ˜„•œ๋‹ค. †Œผ“ ด๋ฒคŠธ๋“ค ฒ˜๋ฆฌ— ๋Œ€•œ ธ„Ž˜ดŠค๊ฐ€ •„ฃผ ๊น”๋”. ฐธ ๋งˆŒ— ๋“ ๋‹ค.

MFC ˜ CSocket ๋ฅผ ‚ฌšฉ•˜๋Š” Šคƒ€ผ๋กœ ”„๋กœ๊ทธ๋ž˜๋ฐ„ •  ˆ˜ žˆ๋Š”๋ฐ, Python ด๊ธฐ— ฝ”๋“œ๊ฐ€ ๋” ๊น”๋”. ๊ทธ๋ฆฌ๊ณ  Windows/Linux –‘ชฝ ๋‹ค ๊ฐ€๋Šฅ.

๋‹คŒ€ ™”ผ ๋ณด๋‚ด๋Š” ๋ถ€๋ถ„๊ณผ ๊ด€๋ จ•œ ๊ฐ„๋‹จ•œ ˜ˆ œ.
~cpp 
import asyncore
import socket
from threading import *
import os

import os.path

class FileSendChannel(asyncore.dispatcher, Thread):
    def __init__(self, aConnection, anAddress):
        asyncore.dispatcher.__init__(self, aConnection)
        Thread.__init__(self)
        print "file send channel create."
        print "address :", anAddress
        self.address = anAddress

    def run(self):
        print "file send channel start."
        self.fileSendMain()

    def writable(self):
        return not self.connected

    def handle_read(self):
        bufferSize=8192
        data = self.recv(bufferSize)
        print "data :", data

    def handle_close(self):
        self.close()
        print "closed channel..."

    def getFileSize(self, aFileName):
        return os.path.getsize(aFileName)

    def fileSendMain(self):
        aFileName='f:/sample.jpg'
        fileSize=self.getFileSize(aFileName)
        print "file size : ", fileSize
        f = open(aFileName, "rb")
        print "file opened.."
        currentReaded=0
        while currentReaded < fileSize:
            data = f.read(1024)
            #currentReaded = f.tell()
            sended = self.send(data)
            currentReaded+=sended
            f.seek(currentReaded, 0)
            print "current : %d, sended : %d"%(currentReaded, sended)
        f.close()
        print "send completed..."
        self.close()

class FileSendServer(asyncore.dispatcher):
    def __init__(self):
        asyncore.dispatcher.__init__(self)

    def initialize(self):
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)

    def handle_accept(self):
        connection, address = self.accept()
        channel = FileSendChannel(connection, address)
        channel.start()

    def handle_close(self):
        pass

    def handle_read(self):
        pass

    def handle_write(self):
        pass

    def serve(self, aPort):
        self.initialize()
        here = ('', aPort)
        self.bind(here)
        self.listen(5)

if __name__=='__main__':
    server = FileSendServer()
    server.serve(30002)
    asyncore.loop()

๋‹คŒ€ ™”ผ ๋ฐ›๋Š” ๋ถ€๋ถ„๊ณผ ๊ด€๋ จ•œ ๊ฐ„๋‹จ•œ ˜ˆ œ.
~cpp 
import asyncore
import socket

class FileReceiveChannel(asyncore.dispatcher):
    def __init__(self):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.received = 0
        self.f=open("f://output1.jpg","wb")

    def handle_connect(self):
        print "connected..."

    def writable(self):
        return not self.connected

    def handle_write(self):
        pass

    def handle_read(self):
        data = self.recv(8192)
        self.received += len(data)
        print "received : %d, %d"%(len(data), self.received)
        self.f.write(data)

    def handle_close(self):
        print "closed..."
        self.f.close()
        self.close()

    def main(self, aHost, aPort):
        self.connect((aHost, aPort))

if __name__=="__main__":
    client=FileReceiveChannel()
    host = "localhost"
    port = 30002
    client.main(host, port)
    asyncore.loop()

—ฌ๊ธฐ„œ recv ๋ฉ”†Œ๋“œ๋Š” ๋ฐด„ฐ๊ฐ€ ๋“ค–ด˜จ ๋งŒผ ๋ฐ›๋Š”๋‹ค. (ฆ‰, ๋ฒ„ผ‚ฌดˆ๋งŒผ ๋ฐด„ฐ๊ฐ€ ๋“ค–ด˜ฌ๋•Œ๊นŒง€ ๊ธฐ๋‹ค๋ฆฌง€ •Š๋Š”๋‹ค.)

5. ฐธ๊ณ  ‚ฌดŠธ

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:24:08
Processing time 0.0119 sec