<?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=2%ED%95%99%EA%B8%B0%ED%8C%8C%EC%9D%B4%EC%84%A0%EC%8A%A4%ED%84%B0%EB%94%94%2F%EC%84%9C%EB%B2%84</id>
	<title>2학기파이선스터디/서버 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=2%ED%95%99%EA%B8%B0%ED%8C%8C%EC%9D%B4%EC%84%A0%EC%8A%A4%ED%84%B0%EB%94%94%2F%EC%84%9C%EB%B2%84"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=2%ED%95%99%EA%B8%B0%ED%8C%8C%EC%9D%B4%EC%84%A0%EC%8A%A4%ED%84%B0%EB%94%94/%EC%84%9C%EB%B2%84&amp;action=history"/>
	<updated>2026-05-15T16:00:17Z</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=2%ED%95%99%EA%B8%B0%ED%8C%8C%EC%9D%B4%EC%84%A0%EC%8A%A4%ED%84%B0%EB%94%94/%EC%84%9C%EB%B2%84&amp;diff=83981&amp;oldid=prev</id>
		<title>Maintenance script: Repair batch-0001 pages from live compare</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=2%ED%95%99%EA%B8%B0%ED%8C%8C%EC%9D%B4%EC%84%A0%EC%8A%A4%ED%84%B0%EB%94%94/%EC%84%9C%EB%B2%84&amp;diff=83981&amp;oldid=prev"/>
		<updated>2026-03-26T23:55:58Z</updated>

		<summary type="html">&lt;p&gt;Repair batch-0001 pages from live compare&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 23:55, 26 March 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l364&quot;&gt;Line 364:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 364:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;----&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;----&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;2학기파이선스터디&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/ins&gt;2학기파이선스터디&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=2%ED%95%99%EA%B8%B0%ED%8C%8C%EC%9D%B4%EC%84%A0%EC%8A%A4%ED%84%B0%EB%94%94/%EC%84%9C%EB%B2%84&amp;diff=83912&amp;oldid=prev</id>
		<title>Maintenance script: Repair pages found by live-compare batch 0001</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=2%ED%95%99%EA%B8%B0%ED%8C%8C%EC%9D%B4%EC%84%A0%EC%8A%A4%ED%84%B0%EB%94%94/%EC%84%9C%EB%B2%84&amp;diff=83912&amp;oldid=prev"/>
		<updated>2026-03-26T14:46:16Z</updated>

		<summary type="html">&lt;p&gt;Repair pages found by live-compare batch 0001&lt;/p&gt;
&lt;a href=&quot;https://mediawiki.zeropage.org/index.php?title=2%ED%95%99%EA%B8%B0%ED%8C%8C%EC%9D%B4%EC%84%A0%EC%8A%A4%ED%84%B0%EB%94%94/%EC%84%9C%EB%B2%84&amp;amp;diff=83912&amp;amp;oldid=26743&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=2%ED%95%99%EA%B8%B0%ED%8C%8C%EC%9D%B4%EC%84%A0%EC%8A%A4%ED%84%B0%EB%94%94/%EC%84%9C%EB%B2%84&amp;diff=26743&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:22, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=2%ED%95%99%EA%B8%B0%ED%8C%8C%EC%9D%B4%EC%84%A0%EC%8A%A4%ED%84%B0%EB%94%94/%EC%84%9C%EB%B2%84&amp;diff=26743&amp;oldid=prev"/>
		<updated>2021-02-07T05:22:13Z</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;== 원본 ==&lt;br /&gt;
 import socket&lt;br /&gt;
 from SocketServer import ThreadingTCPServer, StreamRequestHandler&lt;br /&gt;
 import thread&lt;br /&gt;
 &lt;br /&gt;
 PORT = 8037&lt;br /&gt;
 lock = thread.allocate_lock()   # 상호 배제 구현을 위한 락 객체&lt;br /&gt;
 &lt;br /&gt;
 class UsersList:&lt;br /&gt;
     def __init__(self):&lt;br /&gt;
         self.users = {}&lt;br /&gt;
 &lt;br /&gt;
     def __contains__(self, name):   # in 연산자 메쏘드&lt;br /&gt;
         return name in self.users&lt;br /&gt;
 &lt;br /&gt;
     def addUser(self, conn, addr, name):&lt;br /&gt;
         if name in self.users:&lt;br /&gt;
             conn.send(&amp;#039;Already resistered name\n&amp;#039;)&lt;br /&gt;
             return None&lt;br /&gt;
         lock.acquire()  # 상호 배제&lt;br /&gt;
         self.users[name] = (conn, addr)&lt;br /&gt;
         lock.release()&lt;br /&gt;
         # 각종 메시지 출력&lt;br /&gt;
         self.broadcastMessage(&amp;#039;[&amp;#039;+name+&amp;#039;]&amp;#039; + &amp;#039; entered\n&amp;#039;)&lt;br /&gt;
         conn.send(&amp;#039;[%s] Welcome!\n&amp;#039;%name)   # 본인에게 가는 메시지&lt;br /&gt;
         print len(self.users), &amp;#039;connections&amp;#039;    # 서버에 표시되는 메시지&lt;br /&gt;
         return name&lt;br /&gt;
 &lt;br /&gt;
     def removeUser(self, name):&lt;br /&gt;
         if name not in self.users:&lt;br /&gt;
             return&lt;br /&gt;
         lock.acquire()  # 상호 배제&lt;br /&gt;
         del self.users[name]&lt;br /&gt;
         lock.release()&lt;br /&gt;
         self.broadcastMessage(&amp;#039;[&amp;#039;+name+&amp;#039;] &amp;#039;+&amp;#039; has gone!\n&amp;#039;)&lt;br /&gt;
         print len(self.users), &amp;#039;connections&amp;#039;    # 서버에 표시되는 메시지&lt;br /&gt;
 &lt;br /&gt;
     def handleMessage(self, name, msg):&lt;br /&gt;
         if msg[0] != &amp;#039;/&amp;#039;:&lt;br /&gt;
             self.broadcastMessage(&amp;#039;[&amp;#039;+name+&amp;#039;] &amp;#039; + msg)&lt;br /&gt;
             return&lt;br /&gt;
         cmd = msg[1:].rstrip().split()&lt;br /&gt;
         if cmd[0] == &amp;#039;quit&amp;#039;:&lt;br /&gt;
             self.removeUser(name)&lt;br /&gt;
             return -1&lt;br /&gt;
     def broadcastMessage(self, msg):&lt;br /&gt;
         for conn, addr in self.users.values():&lt;br /&gt;
             conn.send(msg)&lt;br /&gt;
 &lt;br /&gt;
 class RequestHandler(StreamRequestHandler):&lt;br /&gt;
     users = UsersList()&lt;br /&gt;
     # 접속 요구가 들어오면 호출된다.&lt;br /&gt;
     def handle(self):&lt;br /&gt;
         print &amp;#039;connection from&amp;#039;, self.client_address&lt;br /&gt;
         #서버에 표시되는 메시지&lt;br /&gt;
         conn = self.request&lt;br /&gt;
         try:&lt;br /&gt;
             name = self.readAngRegisterName()&lt;br /&gt;
             data = self.receiveline()&lt;br /&gt;
             while data:&lt;br /&gt;
                 if self.users.handleMessage(name, data) == -1:&lt;br /&gt;
                     conn.close()&lt;br /&gt;
                     break&lt;br /&gt;
                 data = self.receiveline()&lt;br /&gt;
         except socket.error:&lt;br /&gt;
             print &amp;#039;Socket Error&amp;#039;&lt;br /&gt;
         print &amp;#039;Disconnected from&amp;#039;, self.client_address&lt;br /&gt;
     #서버 메시지&lt;br /&gt;
         self.users.removeUser(name)&lt;br /&gt;
 &lt;br /&gt;
     #참여자 이름을 읽어서 등록한다&lt;br /&gt;
     def readAngRegisterName(self):&lt;br /&gt;
         while 1:&lt;br /&gt;
             self.request.send(&amp;#039;Name ? &amp;#039;)&lt;br /&gt;
             name = self.receiveline().strip()   #이름 읽기&lt;br /&gt;
             if self.users.addUser(self.request, self.client_address, name):&lt;br /&gt;
                 return name&lt;br /&gt;
 &lt;br /&gt;
     #한 라인을 읽어들인다.&lt;br /&gt;
     def receiveline(self):&lt;br /&gt;
         line = []&lt;br /&gt;
         while 1:&lt;br /&gt;
             data = self.request.recv(1024)&lt;br /&gt;
             line.append(data)&lt;br /&gt;
             if data[-1] == &amp;#039;\n&amp;#039;:&lt;br /&gt;
                 return &amp;#039;&amp;#039;.join(line)&lt;br /&gt;
 &lt;br /&gt;
 # ============================================================&lt;br /&gt;
 if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
     server = ThreadingTCPServer((&amp;quot;&amp;quot;, PORT), RequestHandler)&lt;br /&gt;
     print &amp;#039;listening on port&amp;#039;, PORT&lt;br /&gt;
     server.serve_forever()&lt;br /&gt;
== 수정 ==&lt;br /&gt;
 import socket  &lt;br /&gt;
 from SocketServer import ThreadingTCPServer, StreamRequestHandler  &lt;br /&gt;
 import thread  &lt;br /&gt;
   &lt;br /&gt;
 PORT = 4444 &lt;br /&gt;
 lock = thread.allocate_lock()   # 상호 배제 구현을 위한 락 객체  &lt;br /&gt;
   &lt;br /&gt;
 class Users:  &lt;br /&gt;
     def __init__(self, aId, msg,addr, isinEntry = False): &lt;br /&gt;
         self.ID = aID    &lt;br /&gt;
         self.message = msg &lt;br /&gt;
 ##       self.conn = conn&lt;br /&gt;
         self.addr = addr &lt;br /&gt;
         self.isinEntry &lt;br /&gt;
   &lt;br /&gt;
 #    def __contains__(self, name):   # in 연산자 메쏘드  &lt;br /&gt;
 #        return name in self.users  &lt;br /&gt;
   &lt;br /&gt;
     def addUser(self):  &lt;br /&gt;
         if self.isinEntry:  &lt;br /&gt;
             self.send(&amp;#039;Already resistered name\n&amp;#039;)  &lt;br /&gt;
             return None  &lt;br /&gt;
         lock.acquire()  # 상호 배제 &lt;br /&gt;
         self.append(Users(self.ID, self.message, self.isinEntry)) &lt;br /&gt;
         lock.release()  &lt;br /&gt;
         # 각종 메시지 출력  &lt;br /&gt;
         self.broadcastMessage(&amp;#039;[&amp;#039;+self.ID+&amp;#039;]&amp;#039; + &amp;#039; entered\n&amp;#039;)  &lt;br /&gt;
         self.send(&amp;#039;[%s] Welcome!\n&amp;#039;%self.ID)   # 본인에게 가는 메시지  &lt;br /&gt;
         print len(Users), &amp;#039;connections&amp;#039;    # 서버에 표시되는 메시지  &lt;br /&gt;
         return self.ID &lt;br /&gt;
   &lt;br /&gt;
     def removeUser(self):  &lt;br /&gt;
         if self.ID not in Users:  &lt;br /&gt;
             return  &lt;br /&gt;
         lock.acquire()  # 상호 배제  &lt;br /&gt;
         self.remove(Users) &lt;br /&gt;
         lock.release()  &lt;br /&gt;
         self.broadcastMessage(&amp;#039;[&amp;#039;+self.ID+&amp;#039;] &amp;#039;+&amp;#039; has gone!\n&amp;#039;)  &lt;br /&gt;
         print len(Users), &amp;#039;connections&amp;#039;    # 서버에 표시되는 메시지  &lt;br /&gt;
   &lt;br /&gt;
     def handleMessage(self, msg):  &lt;br /&gt;
         if msg[0] != &amp;#039;/&amp;#039;:  &lt;br /&gt;
             self.broadcastMessage(&amp;#039;[&amp;#039;+self.ID+&amp;#039;] &amp;#039; + msg)  &lt;br /&gt;
             return  &lt;br /&gt;
         cmd = msg[1:].rstrip().split()  &lt;br /&gt;
 #        if cmd[0] == &amp;#039;quit&amp;#039;:  &lt;br /&gt;
 #            self.removeUser(name)  &lt;br /&gt;
 #            return -1 &lt;br /&gt;
          &lt;br /&gt;
        # self.users[name] = (conn, addr)  &lt;br /&gt;
  &lt;br /&gt;
 #    def broadcastMessage(self, msg):  &lt;br /&gt;
 #        for conn, addr in Users:  &lt;br /&gt;
 #            conn.send(msg)  &lt;br /&gt;
   &lt;br /&gt;
 class RequestHandler(StreamRequestHandler):  &lt;br /&gt;
     # 접속 요구가 들어오면 호출된다. &lt;br /&gt;
  &lt;br /&gt;
     def handle(self):&lt;br /&gt;
         &lt;br /&gt;
         print &amp;#039;connection from&amp;#039;, self.client_address # client address &lt;br /&gt;
         #서버에 표시되는 메시지&lt;br /&gt;
         conn = self.request     # conn : object&lt;br /&gt;
         &lt;br /&gt;
         a = conn.recv(1024)&lt;br /&gt;
         u = Users(a.ID, a.message,self.client_address, a.isinEntry)&lt;br /&gt;
         u.addUser()&lt;br /&gt;
         conn.send(u.ID) &lt;br /&gt;
         try:  &lt;br /&gt;
 ##            name = self.readAngRegisterName()  &lt;br /&gt;
             data = self.receiveline()  &lt;br /&gt;
             while data:  &lt;br /&gt;
                 if self.users.handleMessage(data) == -1:  &lt;br /&gt;
                     conn.close()  &lt;br /&gt;
                     break  &lt;br /&gt;
                 data = self.receiveline()  &lt;br /&gt;
         except socket.error:  &lt;br /&gt;
             print &amp;#039;Socket Error&amp;#039;  &lt;br /&gt;
         print &amp;#039;Disconnected from&amp;#039;, self.client_address  &lt;br /&gt;
     #서버 메시지  &lt;br /&gt;
         u.remove(u) &lt;br /&gt;
   &lt;br /&gt;
     #참여자 이름을 읽어서 등록한다 &lt;br /&gt;
          &lt;br /&gt;
 ##    def readAngRegisterName(self):  &lt;br /&gt;
 ##        while 1:  &lt;br /&gt;
 ##            self.request.send(&amp;#039;Name ? &amp;#039;)  &lt;br /&gt;
 ##            name = self.receiveline().strip()   #이름 읽기  &lt;br /&gt;
 ##            if self.users.addUser(self.request, self.client_address, name):  &lt;br /&gt;
 ##                return name  &lt;br /&gt;
   &lt;br /&gt;
     #한 라인을 읽어들인다.  &lt;br /&gt;
     def receiveline(self):  &lt;br /&gt;
         line = []  &lt;br /&gt;
         while 1:  &lt;br /&gt;
             data = self.request.recv(1024)  &lt;br /&gt;
             line.append(data)  &lt;br /&gt;
             if data[-1] == &amp;#039;\n&amp;#039;:  &lt;br /&gt;
                 return &amp;#039;&amp;#039;.join(line)  &lt;br /&gt;
   &lt;br /&gt;
 # ============================================================  &lt;br /&gt;
 if __name__ == &amp;#039;__main__&amp;#039;:  &lt;br /&gt;
     server = ThreadingTCPServer((&amp;quot;&amp;quot;, PORT), RequestHandler)  &lt;br /&gt;
     print &amp;#039;listening on port&amp;#039;, PORT  &lt;br /&gt;
     server.serve_forever() &lt;br /&gt;
== 재선 ==&lt;br /&gt;
 import socket  &lt;br /&gt;
 from SocketServer import ThreadingTCPServer, StreamRequestHandler  &lt;br /&gt;
 import thread  &lt;br /&gt;
   &lt;br /&gt;
 PORT = 8037  &lt;br /&gt;
 lock = thread.allocate_lock()   # 상호 배제 구현을 위한 락 객체  &lt;br /&gt;
 class UsersList:  &lt;br /&gt;
     def __init__(self):  &lt;br /&gt;
         self.users = {}  &lt;br /&gt;
   &lt;br /&gt;
     def __contains__(self, name):   # in 연산자 메쏘드  &lt;br /&gt;
         return name in self.users  &lt;br /&gt;
   &lt;br /&gt;
     def addUser(self, conn, msg, name):  &lt;br /&gt;
         if name in self.users:  &lt;br /&gt;
             conn.send(&amp;#039;Already resistered name\n&amp;#039;)  &lt;br /&gt;
             return None  &lt;br /&gt;
         lock.acquire()  # 상호 배제  &lt;br /&gt;
         self.users[name] = (conn, msg)  &lt;br /&gt;
         lock.release()  &lt;br /&gt;
         # 각종 메시지 출력  &lt;br /&gt;
         self.broadcastMessage(&amp;#039;[&amp;#039;+name+&amp;#039;]&amp;#039; + &amp;#039; entered\n&amp;#039;)  &lt;br /&gt;
         conn.send(&amp;#039;[%s] Welcome!\n&amp;#039;%name)   # 본인에게 가는 메시지  &lt;br /&gt;
         print len(self.users), &amp;#039;connections&amp;#039;    # 서버에 표시되는 메시지  &lt;br /&gt;
         return name  &lt;br /&gt;
  #(&amp;#039;id&amp;#039; : (object, message)) &lt;br /&gt;
     def removeUser(self, name):  &lt;br /&gt;
         if name not in self.users:  &lt;br /&gt;
             return  &lt;br /&gt;
         lock.acquire()  # 상호 배제  &lt;br /&gt;
         del self.users[name]  &lt;br /&gt;
         lock.release()  &lt;br /&gt;
         self.broadcastMessage(&amp;#039;[&amp;#039;+name+&amp;#039;] &amp;#039;+&amp;#039; has gone!\n&amp;#039;)  &lt;br /&gt;
         print len(self.users), &amp;#039;connections&amp;#039;    # 서버에 표시되는 메시지  &lt;br /&gt;
   &lt;br /&gt;
     def handleMessage(self, name, msg):  &lt;br /&gt;
         if msg[0] != &amp;#039;/&amp;#039;:  &lt;br /&gt;
             self.broadcastMessage(&amp;#039;[&amp;#039;+name+&amp;#039;] &amp;#039; + msg)  &lt;br /&gt;
             return  &lt;br /&gt;
         cmd = msg[1:].rstrip().split()  &lt;br /&gt;
         if cmd[0] == &amp;#039;quit&amp;#039;:  &lt;br /&gt;
             self.removeUser(name)  &lt;br /&gt;
             return -1  &lt;br /&gt;
     def broadcastMessage(self, msg):  &lt;br /&gt;
         for conn, addr in self.users.values():  &lt;br /&gt;
             conn.send(msg)  &lt;br /&gt;
   &lt;br /&gt;
 class RequestHandler(StreamRequestHandler):  &lt;br /&gt;
     users = UsersList()  &lt;br /&gt;
     # 접속 요구가 들어오면 호출된다.  &lt;br /&gt;
     def handle(self):  &lt;br /&gt;
         print &amp;#039;connection from&amp;#039;, self.client_address  &lt;br /&gt;
         #서버에 표시되는 메시지  &lt;br /&gt;
         conn = self.request &lt;br /&gt;
 &lt;br /&gt;
         try:  &lt;br /&gt;
             name = self.users.addUser(self.request, self.client_address, name)&lt;br /&gt;
             if name:&lt;br /&gt;
                 conn.send(true)&lt;br /&gt;
             else:&lt;br /&gt;
                 conn.send(false)&lt;br /&gt;
             &lt;br /&gt;
             data = self.receiveline()  &lt;br /&gt;
             while data:&lt;br /&gt;
                 if self.users.handleMessage(name, data) == -1:  &lt;br /&gt;
                     conn.close()  &lt;br /&gt;
                     break  &lt;br /&gt;
                 data = self.receiveline()  &lt;br /&gt;
         except socket.error:  &lt;br /&gt;
             print &amp;#039;Socket Error&amp;#039;  &lt;br /&gt;
         print &amp;#039;Disconnected from&amp;#039;, self.client_address  &lt;br /&gt;
     #서버 메시지  &lt;br /&gt;
         self.users.removeUser(name)  &lt;br /&gt;
   &lt;br /&gt;
     #참여자 이름을 읽어서 등록한다  &lt;br /&gt;
 ##    def readAngRegisterName(self):  &lt;br /&gt;
 ##        while 1:  &lt;br /&gt;
 ##            self.request.send(&amp;#039;Name ? &amp;#039;)  &lt;br /&gt;
 ##            name = self.receiveline().strip()   #이름 읽기  &lt;br /&gt;
 ##            if self.users.addUser(self.request, self.client_address, name):  &lt;br /&gt;
 ##                return name  &lt;br /&gt;
   &lt;br /&gt;
     #한 라인을 읽어들인다.  &lt;br /&gt;
     def receiveline(self):&lt;br /&gt;
         line = []&lt;br /&gt;
         while 1:&lt;br /&gt;
             data = self.request.recv(1024)&lt;br /&gt;
             line.append(data)&lt;br /&gt;
             if data[-1] == &amp;#039;\n&amp;#039;:&lt;br /&gt;
                 return &amp;#039;&amp;#039;.join(line)  &lt;br /&gt;
   &lt;br /&gt;
 # ============================================================  &lt;br /&gt;
 if __name__ == &amp;#039;__main__&amp;#039;:  &lt;br /&gt;
     server = ThreadingTCPServer((&amp;quot;&amp;quot;, PORT), RequestHandler)  &lt;br /&gt;
     print &amp;#039;listening on port&amp;#039;, PORT  &lt;br /&gt;
     server.serve_forever()  &lt;br /&gt;
 import tkSimpleDialog    &lt;br /&gt;
 from Tkinter import *  &lt;br /&gt;
 from socket import *   &lt;br /&gt;
   &lt;br /&gt;
       &lt;br /&gt;
 class Main:       &lt;br /&gt;
     def __init__(self, aMaster, aUser, aSock):       &lt;br /&gt;
         self.frame = Frame(aMaster)  &lt;br /&gt;
 #for show texts     &lt;br /&gt;
         self.showscrollbar = Scrollbar(aMaster)     &lt;br /&gt;
         self.showscrollbar.place(x = 550, y = 0, width = 50, height = 550)     &lt;br /&gt;
         self.show = Listbox(aMaster, yscrollcommand = self.showscrollbar.set)       &lt;br /&gt;
         self.show.place(x = 0, y = 0, width = 585, height = 550)     &lt;br /&gt;
         self.showscrollbar.config(command = self.show.yview)     &lt;br /&gt;
 #for user list  &lt;br /&gt;
         self.listscrollbar = Scrollbar(aMaster)      &lt;br /&gt;
         self.listscrollbar.place(x = 800-50, y = 0, width = 50, height = 600)     &lt;br /&gt;
         self.list = Listbox(aMaster, yscrollcommand = self.listscrollbar.set)   &lt;br /&gt;
         self.list.place(x = 600, y = 0, width = 185, height = 600)     &lt;br /&gt;
         self.listscrollbar.config(command = self.list.yview)      &lt;br /&gt;
 #for input a string   &lt;br /&gt;
         self.edit = Entry(aMaster)    &lt;br /&gt;
         self.edit.place(x = 0, y = 550 , width = 600 , height = 50)    &lt;br /&gt;
     def sendMessage(self, event):  &lt;br /&gt;
         aUser.message = self.edit.get()  &lt;br /&gt;
         self.edit.delete(0, END)  &lt;br /&gt;
         csock.send(aUser)  &lt;br /&gt;
         self.recieveMassage()  &lt;br /&gt;
     def recieveMassage(self):  &lt;br /&gt;
         user = aSock.recv(1024)  &lt;br /&gt;
         self.show(user)  &lt;br /&gt;
     def show(self, aUser):  &lt;br /&gt;
         self.show.insert(END, &amp;quot;&amp;amp;lt; &amp;quot; + str(aUser.ID) + &amp;quot; &amp;amp;gt; : &amp;quot; + str(aUser.message))  &lt;br /&gt;
   &lt;br /&gt;
     &lt;br /&gt;
 class User:    &lt;br /&gt;
     def __init__(self, aID):    &lt;br /&gt;
         self.ID = aID    &lt;br /&gt;
         self.message = &amp;#039;&amp;#039;    &lt;br /&gt;
 ##        self.isinEntry = True  &lt;br /&gt;
           &lt;br /&gt;
                     &lt;br /&gt;
 if __name__ == &amp;quot;__main__&amp;quot;:       &lt;br /&gt;
     root = Tk()      &lt;br /&gt;
     root.configure( width = 800, height = 600)    &lt;br /&gt;
     login = tkSimpleDialog    &lt;br /&gt;
 ##    login.Place.place_configure( root, x = 100, y = 100) #position    &lt;br /&gt;
     &lt;br /&gt;
     csock = socket(AF_INET, SOCK_STREAM)  &lt;br /&gt;
     try:  &lt;br /&gt;
         csock.connect((&amp;#039;&amp;#039;, 8037))#make socket, connect  &lt;br /&gt;
     except:  &lt;br /&gt;
         print &amp;#039;connect refuse&amp;#039;  &lt;br /&gt;
 ##    csock.recv(1024)  &lt;br /&gt;
     ID = &amp;#039;&amp;#039;   &lt;br /&gt;
     while not ID:    &lt;br /&gt;
         ID = login.askstring(title = &amp;quot;Login&amp;quot;, prompt=&amp;quot;Enter ID&amp;quot;, parent = root)   &lt;br /&gt;
         user = User(ID)    &lt;br /&gt;
         csock.send(user.ID)    &lt;br /&gt;
         registered= csock.recv(1024)&lt;br /&gt;
         if registered:&lt;br /&gt;
             continue&lt;br /&gt;
     else:   &lt;br /&gt;
         win = Main(root, user, csock)    &lt;br /&gt;
         root.bind(&amp;quot;&amp;amp;lt;Return&amp;amp;gt;&amp;quot;, win.sendMessage)  &lt;br /&gt;
         while True:  &lt;br /&gt;
             user = csock.recv(1024)  &lt;br /&gt;
         root.mainloop()  &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[2학기파이선스터디]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>