<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=PythonNetworkProgramming</id>
	<title>PythonNetworkProgramming - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=PythonNetworkProgramming"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=PythonNetworkProgramming&amp;action=history"/>
	<updated>2026-05-14T13:00:27Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=PythonNetworkProgramming&amp;diff=38046&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:24, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=PythonNetworkProgramming&amp;diff=38046&amp;oldid=prev"/>
		<updated>2021-02-07T05:24:08Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
Python 에서는 기본적으로 Socket Library 를 제공해준다. 그리고 async i/o 모듈인 medusa 가 이제는 기본으로 제공된다.&lt;br /&gt;
&lt;br /&gt;
만일 winsock 을 쓰고 싶다면 windows extension libary 들을 설치해주면 된다.&lt;br /&gt;
=== TCP Socket ===&lt;br /&gt;
==== Client ====&lt;br /&gt;
 from socket import *&lt;br /&gt;
 host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
 port = 9000&lt;br /&gt;
 addr = (host, port)&lt;br /&gt;
 sock = socket(AF_INET, SOCK_STREAM)&lt;br /&gt;
 sock.connect(addr)&lt;br /&gt;
 sock.send(&amp;quot;TEST&amp;quot;)&lt;br /&gt;
 sock.close&lt;br /&gt;
&lt;br /&gt;
==== Server ====&lt;br /&gt;
 from socket import *&lt;br /&gt;
 port = 9010&lt;br /&gt;
 bufsize = 1024&lt;br /&gt;
 maximumConnection = 5&lt;br /&gt;
 sock = socket(AF_INET, SOCK_STREAM)&lt;br /&gt;
 sock.bind((&amp;quot;localhost&amp;quot;,port))&lt;br /&gt;
 sock.listen(maximumConnection)&lt;br /&gt;
 while 1:&lt;br /&gt;
     newsock, client_addr = sock.accept()&lt;br /&gt;
     print &amp;quot;Client connected:&amp;quot;,client_addr&lt;br /&gt;
     data = newsock.recv(bufsize)&lt;br /&gt;
     print data&lt;br /&gt;
=== UDP Socket ===&lt;br /&gt;
 #server.py&lt;br /&gt;
 from socket import *&lt;br /&gt;
 host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
 port = 1005&lt;br /&gt;
 buf = 1024&lt;br /&gt;
 addr = (host, port)&lt;br /&gt;
 UDPSock = socket(AF_INET, SOCK_DGRAM)&lt;br /&gt;
 UDPSock.bind(addr)&lt;br /&gt;
 while 1:&lt;br /&gt;
     data, addr = UDPSock.recvfrom(buf)&lt;br /&gt;
     if not data:&lt;br /&gt;
         print &amp;quot;Client has exited!&amp;quot;&lt;br /&gt;
         break&lt;br /&gt;
     else:&lt;br /&gt;
         print &amp;quot;\n Received message &amp;#039;&amp;quot;, data,&amp;quot;&amp;#039;&amp;quot;&lt;br /&gt;
 UDPSock.close()        &lt;br /&gt;
 &lt;br /&gt;
 #client.py &lt;br /&gt;
 from socket import *&lt;br /&gt;
 host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
 port = 1005&lt;br /&gt;
 buf = 1024&lt;br /&gt;
 addr = (host, port)&lt;br /&gt;
 UDPSock = socket(AF_INET, SOCK_DGRAM)&lt;br /&gt;
 def_msg = &amp;quot;==Enter message to send to server==&amp;quot;&lt;br /&gt;
 print &amp;quot;\n&amp;quot;, def_msg&lt;br /&gt;
 while(1):&lt;br /&gt;
     data = raw_input(&amp;#039;&amp;amp;gt;&amp;amp;gt; &amp;#039;)&lt;br /&gt;
     if not data:&lt;br /&gt;
         break&lt;br /&gt;
     else:&lt;br /&gt;
         if(UDPSock.sendto(data,addr)):&lt;br /&gt;
             print &amp;quot;Sending message &amp;#039;&amp;quot;,data,&amp;quot;&amp;#039;...&amp;quot;&lt;br /&gt;
 UDPSock.close()&lt;br /&gt;
=== normal socket ===&lt;br /&gt;
역시. 아주아주 간단한 예제.~&lt;br /&gt;
&lt;br /&gt;
 from socket import *&lt;br /&gt;
 from threading import *&lt;br /&gt;
 &lt;br /&gt;
 class ListenThread(Thread):&lt;br /&gt;
     def __init__(self, aServer):&lt;br /&gt;
         Thread.__init__(self)&lt;br /&gt;
         self.server=aServer&lt;br /&gt;
     def run(self):&lt;br /&gt;
         clientConnection, address = self.server.listenSock.accept()&lt;br /&gt;
         print address&lt;br /&gt;
         clientConnection.send(&amp;quot;hahaharn&amp;quot;)&lt;br /&gt;
         clientConnection.close()&lt;br /&gt;
         self.server.listenSock.close()&lt;br /&gt;
 &lt;br /&gt;
 class Server:&lt;br /&gt;
     def serve(self, aPort):&lt;br /&gt;
         self.listenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)&lt;br /&gt;
         here=(&amp;#039;&amp;#039;,aPort)&lt;br /&gt;
         self.listenSock.bind(here)&lt;br /&gt;
         self.listenSock.listen(5)&lt;br /&gt;
         listenThread=ListenThread(self)&lt;br /&gt;
         listenThread.start()&lt;br /&gt;
 &lt;br /&gt;
 if __name__==&amp;quot;__main__&amp;quot;:&lt;br /&gt;
     server = Server()&lt;br /&gt;
     server.serve(30002)&lt;br /&gt;
&lt;br /&gt;
또는, 기본 모듈로 있는 SocketServer 모듈을 사용할 수 있다. 다음은 간단한 예제.&lt;br /&gt;
 from SocketServer import *&lt;br /&gt;
 HOST = (&amp;#039;&amp;#039;, 7000)&lt;br /&gt;
 ClientList = []&lt;br /&gt;
 ClientConnections = []&lt;br /&gt;
 &lt;br /&gt;
 class MyServer (BaseRequestHandler):&lt;br /&gt;
     def broadcast (self, msg):&lt;br /&gt;
         for conn in ClientConnections:&lt;br /&gt;
             conn.send (msg)&lt;br /&gt;
                     &lt;br /&gt;
     def handle(self):&lt;br /&gt;
         conn = self.request&lt;br /&gt;
         if conn:&lt;br /&gt;
             peername = conn.getpeername ()&lt;br /&gt;
             ClientList.append (peername)&lt;br /&gt;
             ClientConnections.append (conn)&lt;br /&gt;
             print &amp;quot;Requested by &amp;quot;, peername&lt;br /&gt;
 &lt;br /&gt;
         try:&lt;br /&gt;
             cmd = raw_input (&amp;quot;&amp;amp;gt;&amp;amp;gt; &amp;quot;)&lt;br /&gt;
             while cmd:&lt;br /&gt;
                 if cmd == &amp;#039;ls&amp;#039;:&lt;br /&gt;
                     print &amp;quot;== Connected Client Lists ==&amp;quot;&lt;br /&gt;
                     print ClientList&lt;br /&gt;
                     self.broadcast (&amp;quot;ls command inputed...n&amp;quot;)&lt;br /&gt;
                 cmd = raw_input (&amp;quot;&amp;amp;gt;&amp;amp;gt; &amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
         except:&lt;br /&gt;
             print &amp;quot;Socket Error occured..&amp;quot;&lt;br /&gt;
             return&lt;br /&gt;
 &lt;br /&gt;
 if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
     my_server = ThreadingTCPServer (HOST, MyServer)&lt;br /&gt;
     my_server.serve_forever ()&lt;br /&gt;
&lt;br /&gt;
=== Medusa ===&lt;br /&gt;
Medusa 는 내부적으로 select / poll 를 이용, 비동기 소켓부분을 구현한다. 소켓 이벤트들 처리에 대한 인터페이스가 아주 깔끔. 참 마음에 든다.&lt;br /&gt;
&lt;br /&gt;
MFC 의 CSocket 를 사용하는 스타일로 프로그래밍을 할 수 있는데, Python 이기에 코드가 더 깔끔. 그리고 Windows/Linux 양쪽 다 가능.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
다음은 화일 보내는 부분과 관련한 간단한 예제.&lt;br /&gt;
 import asyncore&lt;br /&gt;
 import socket&lt;br /&gt;
 from threading import *&lt;br /&gt;
 import os&lt;br /&gt;
 &lt;br /&gt;
 import os.path&lt;br /&gt;
 &lt;br /&gt;
 class FileSendChannel(asyncore.dispatcher, Thread):&lt;br /&gt;
     def __init__(self, aConnection, anAddress):&lt;br /&gt;
         asyncore.dispatcher.__init__(self, aConnection)&lt;br /&gt;
         Thread.__init__(self)&lt;br /&gt;
         print &amp;quot;file send channel create.&amp;quot;&lt;br /&gt;
         print &amp;quot;address :&amp;quot;, anAddress&lt;br /&gt;
         self.address = anAddress&lt;br /&gt;
 &lt;br /&gt;
     def run(self):&lt;br /&gt;
         print &amp;quot;file send channel start.&amp;quot;&lt;br /&gt;
         self.fileSendMain()&lt;br /&gt;
 &lt;br /&gt;
     def writable(self):&lt;br /&gt;
         return not self.connected&lt;br /&gt;
 &lt;br /&gt;
     def handle_read(self):&lt;br /&gt;
         bufferSize=8192&lt;br /&gt;
         data = self.recv(bufferSize)&lt;br /&gt;
         print &amp;quot;data :&amp;quot;, data&lt;br /&gt;
 &lt;br /&gt;
     def handle_close(self):&lt;br /&gt;
         self.close()&lt;br /&gt;
         print &amp;quot;closed channel...&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     def getFileSize(self, aFileName):&lt;br /&gt;
         return os.path.getsize(aFileName)&lt;br /&gt;
 &lt;br /&gt;
     def fileSendMain(self):&lt;br /&gt;
         aFileName=&amp;#039;f:/sample.jpg&amp;#039;&lt;br /&gt;
         fileSize=self.getFileSize(aFileName)&lt;br /&gt;
         print &amp;quot;file size : &amp;quot;, fileSize&lt;br /&gt;
         f = open(aFileName, &amp;quot;rb&amp;quot;)&lt;br /&gt;
         print &amp;quot;file opened..&amp;quot;&lt;br /&gt;
         currentReaded=0&lt;br /&gt;
         while currentReaded &amp;amp;lt; fileSize:&lt;br /&gt;
             data = f.read(1024)&lt;br /&gt;
             #currentReaded = f.tell()&lt;br /&gt;
             sended = self.send(data)&lt;br /&gt;
             currentReaded+=sended&lt;br /&gt;
             f.seek(currentReaded, 0)&lt;br /&gt;
             print &amp;quot;current : %d, sended : %d&amp;quot;%(currentReaded, sended)&lt;br /&gt;
         f.close()&lt;br /&gt;
         print &amp;quot;send completed...&amp;quot;&lt;br /&gt;
         self.close()&lt;br /&gt;
 &lt;br /&gt;
 class FileSendServer(asyncore.dispatcher):&lt;br /&gt;
     def __init__(self):&lt;br /&gt;
         asyncore.dispatcher.__init__(self)&lt;br /&gt;
 &lt;br /&gt;
     def initialize(self):&lt;br /&gt;
         self.create_socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
 &lt;br /&gt;
     def handle_accept(self):&lt;br /&gt;
         connection, address = self.accept()&lt;br /&gt;
         channel = FileSendChannel(connection, address)&lt;br /&gt;
         channel.start()&lt;br /&gt;
 &lt;br /&gt;
     def handle_close(self):&lt;br /&gt;
         pass&lt;br /&gt;
 &lt;br /&gt;
     def handle_read(self):&lt;br /&gt;
         pass&lt;br /&gt;
 &lt;br /&gt;
     def handle_write(self):&lt;br /&gt;
         pass&lt;br /&gt;
 &lt;br /&gt;
     def serve(self, aPort):&lt;br /&gt;
         self.initialize()&lt;br /&gt;
         here = (&amp;#039;&amp;#039;, aPort)&lt;br /&gt;
         self.bind(here)&lt;br /&gt;
         self.listen(5)&lt;br /&gt;
 &lt;br /&gt;
 if __name__==&amp;#039;__main__&amp;#039;:&lt;br /&gt;
     server = FileSendServer()&lt;br /&gt;
     server.serve(30002)&lt;br /&gt;
     asyncore.loop()&lt;br /&gt;
&lt;br /&gt;
다음은 화일 받는 부분과 관련한 간단한 예제.&lt;br /&gt;
 import asyncore&lt;br /&gt;
 import socket&lt;br /&gt;
 &lt;br /&gt;
 class FileReceiveChannel(asyncore.dispatcher):&lt;br /&gt;
     def __init__(self):&lt;br /&gt;
         asyncore.dispatcher.__init__(self)&lt;br /&gt;
         self.create_socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;
         self.received = 0&lt;br /&gt;
         self.f=open(&amp;quot;f://output1.jpg&amp;quot;,&amp;quot;wb&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
     def handle_connect(self):&lt;br /&gt;
         print &amp;quot;connected...&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
     def writable(self):&lt;br /&gt;
         return not self.connected&lt;br /&gt;
 &lt;br /&gt;
     def handle_write(self):&lt;br /&gt;
         pass&lt;br /&gt;
 &lt;br /&gt;
     def handle_read(self):&lt;br /&gt;
         data = self.recv(8192)&lt;br /&gt;
         self.received += len(data)&lt;br /&gt;
         print &amp;quot;received : %d, %d&amp;quot;%(len(data), self.received)&lt;br /&gt;
         self.f.write(data)&lt;br /&gt;
 &lt;br /&gt;
     def handle_close(self):&lt;br /&gt;
         print &amp;quot;closed...&amp;quot;&lt;br /&gt;
         self.f.close()&lt;br /&gt;
         self.close()&lt;br /&gt;
 &lt;br /&gt;
     def main(self, aHost, aPort):&lt;br /&gt;
         self.connect((aHost, aPort))&lt;br /&gt;
 &lt;br /&gt;
 if __name__==&amp;quot;__main__&amp;quot;:&lt;br /&gt;
     client=FileReceiveChannel()&lt;br /&gt;
     host = &amp;quot;localhost&amp;quot;&lt;br /&gt;
     port = 30002&lt;br /&gt;
     client.main(host, port)&lt;br /&gt;
     asyncore.loop()&lt;br /&gt;
&lt;br /&gt;
여기서 recv 메소드는 데이터가 들어온 만큼 받는다. (즉, 버퍼사이즈만큼 데이터가 들어올때까지 기다리지 않는다.)&lt;br /&gt;
&lt;br /&gt;
=== 참고 사이트 ===&lt;br /&gt;
* [http://gnosis.cx/publish/programming/sockets.html]&lt;br /&gt;
----&lt;br /&gt;
[[Python]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>