Python ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก Socket Library ๋ฅผ ์ ๊ณตํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ async i/o ๋ชจ๋์ธ medusa ๊ฐ ์ด์ ๋ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต๋๋ค.
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 ¶
์ญ์. ์์ฃผ์์ฃผ ๊ฐ๋จํ ์์ .~
๋๋, ๊ธฐ๋ณธ ๋ชจ๋๋ก ์๋ SocketServer ๋ชจ๋์ ์ฌ์ฉํ ์ ์๋ค. ๋ค์์ ๊ฐ๋จํ ์์ .
~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)
~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 ์์ชฝ ๋ค ๊ฐ๋ฅ.
๋ค์์ ํ์ผ ๋ณด๋ด๋ ๋ถ๋ถ๊ณผ ๊ด๋ จํ ๊ฐ๋จํ ์์ .
๋ค์์ ํ์ผ ๋ฐ๋ ๋ถ๋ถ๊ณผ ๊ด๋ จํ ๊ฐ๋จํ ์์ .
์ฌ๊ธฐ์ recv ๋ฉ์๋๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์จ ๋งํผ ๋ฐ๋๋ค. (์ฆ, ๋ฒํผ์ฌ์ด์ฆ๋งํผ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ฌ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค.)
~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()









