PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2011/06/06 20:16:34
Name 황신
Subject 파이썬(프로그래밍)질문드립니다
클라이언트
import socket
import threading
import sys

class MyClient(threading.Thread):

    def run(self):
        while 1:
            self.recvMessage()


    def connectToServer(self):
        self.sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        host='localhost'
        port=4020
        self.sock.connect((host, port))

        recvdata = self.sock.recv(1000000).decode('UTF-8')
        name = input(recvdata.lstrip('4|'))
        sendMsg = name + '\n'
        self.sock.send(bytes(sendMsg, 'UTF-8'))
        
        recvdata = self.sock.recv(1000000).decode('UTF-8')        
        m = recvdata.lstrip('4|')
        if m.strip() != 'ok':
            exit()

        self.start() # start new thread
        
        while 1:
            ############## To Do ##############

       def recvMessage(self):
        ############## To Do ##############

if __name__ == '__main__':
    client = MyClient()
    client.connectToServer()


서버
  import socket
from socketserver import ThreadingTCPServer, StreamRequestHandler
import threading
#lock = threading.allocate_lock()
lock = threading.Lock()
PORT = 4020

class Subscriber(object):
    def __init__(self, parent, name=''):
        self.parent = parent
        self.name = name
        self.sock = parent.request
    def setName(self, name):
        self.name = name
    def getName(self):
        return self.name
    def upload(self, msg):
       self.getParent().publisher.handleMessage(self, msg)
    def send(self, msg):
        self.parent.request.sendall(bytes(msg,'UTF-8'))
    def close(self):
        self.parent.request.shutdown(socket.SHUT_RD | socket.SHUT_WR)
        self.parent.request.close()
    def getParent(self):
        return self.parent
    
class Publisher(object):
    def __init__(self):
        self.subscribers = {}

    def addUser(self, user):
        if user.getName() in self.subscribers:
            user.send('5|The name is already registered\n')
            return False
        lock.acquire()
        self.subscribers[user.getName()] = user
        lock.release()
        #self.broadcastMessage('['+user.getName()+']' + ' entered.\n')
        user.send('4|ok\n')
        print ('%s joined' % user.getName())
        print (len(self.subscribers), 'connections.')
        return True
    
    def removeUser(self, name):
        if name not in self.subscribers:
            return False
        user = self.subscribers[name]
#        user.send('Connection closed\n')
        user.close()
        user.getParent().connectedFlag = False
        lock.acquire()
        del self.subscribers[name]
        lock.release()
#        self.broadcastMessage('['+name+']' + ' left.\n')
        print ('%s left' %name)
        print (len(self.subscribers), 'connections')
        return True

    def handleMessage(self, user, msg):
        if not msg.strip():
            return

        print ('receive message from ', user.getName(), ' : ', msg)
        if msg.startswith('0'):
            self.sendSubsList(user)
        elif msg.startswith('2'):
            self.sendAnotherSub(user, msg)
        elif msg.startswith('6'):
            self.removeUser(user.getName())
        else:
            print ('Invalid command: ' , user.getName())

    def broadcastMessage(self, msg):
        for user in self.subscribers.values():
            user.send(msg)

    def sendSubsList(self, user):
        l = '1|'
        for u in self.subscribers.values():
            l = l + u.getName() + '|'
        l = l + '\n'
        user.send(l)
            

    def sendAnotherSub(self, user, msg):
        m = msg.lstrip('2|')
        receiver = m.split('|')[0]
        print ('receiver: ', receiver)
        if receiver not in self.subscribers:
            errMsg = '5|' + receiver + ' is not logging on\n'
            print (errMsg)
            user.send(errMsg)
            return

        sendMsg = '3|'+user.getName()+'|'+m.split('|')[1]
        print (sendMsg)
        print (self.subscribers[receiver].getName())
        self.subscribers[receiver].send(sendMsg)

    
    def action_quit(self, name, args):
        return self.removeUser(name)

class ChatRequestHandler(StreamRequestHandler):
    publisher = Publisher()

    def handle(self):
        print ('connection from', self.client_address)
        try:
            user = self.readAndRegisterName()
            if not user: raise Exception
            self.connectedFlag = True
            data = self.rfile.readline().decode('UTF-8')
            while data:
                user.upload(data)
                if not self.connectedFlag:
                    break
                data = self.rfile.readline().decode('UTF-8')
        except socket.error:
            print ('Socket Error')
        except Exception:
            print ('User Excetion')
            print ('Disconnected from ', self.client_address)
            
        try:
            self.publisher.removeUser(user.getName())
        except:
            pass
        
    def readAndRegisterName(self):
        user = Subscriber(self)
        while 1:
            user.send('4|Enter your name.\n')
            try:
                name = self.rfile.readline().decode('UTF-8').strip()
            except socket.error:
                print ('User Socket Error.')
                user.close()
                return
            if not name or name.startswith('/'):
                user.send('5|Wrong name.\n')
                continue
            user.setName(name)
            if self.publisher.addUser(user):
                return user
                
class ChatServer(ThreadingTCPServer):
    allow_reuser_address = True




if __name__ == '__main__':
    ChatServer.allow_reuse_address = True
    server = ChatServer(("", PORT), ChatRequestHandler)
    print ('listening on port ', PORT)
    server.serve_forever()
    
  
이런 서버와 클라이언트가주어졌을때  
메신져 프로그램을 짜는 문제인데요..
예를들면 hello를 쳤을때 상대방이답이와야한다던지 해야합니다
도움주실분계신가요

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
하얀눈사람
11/06/06 20:31
수정 아이콘
수업을 c만 들어서 잘은 모르겠지만 이거 다 짜여져있는거 아닌가요? 일반적인 채팅프로그램인거같은데요.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
106651 갸름한 남자얼굴엔 무슨 펌이 어울릴까요? [10] 창이2209 11/06/06 2209
106650 어제 나가수에나왔던 샹송... [4] 이뿌니사과2045 11/06/06 2045
106649 압축파일의 압축 효율이 원래 별로 안좋은가요? [8] PariS.1716 11/06/06 1716
106648 . [21] 純粹理性2884 11/06/06 2884
106647 라이카가 비싼 이유? [4] 레몬커피3715 11/06/06 3715
106646 이동영상에 나오는 곡의 이름을 알고싶어요 [2] 알사자르1718 11/06/06 1718
106644 여름에 살 안타는 방법을 알려주세요 [5] 28살 2학년4383 11/06/06 4383
106643 시험보기전 컨디션관리 조언좀 [3] PGR끊고싶다1559 11/06/06 1559
106642 시험기간 마음 다스리기 [1] Unchain1451 11/06/06 1451
106641 유게 자료 찾는 질문 [1] 뻥치시네1220 11/06/06 1220
106639 LG트윈스 응원가 질문입니다.^^ [15] 노력하는나1522 11/06/06 1522
106638 파이썬(프로그래밍)질문드립니다 [3] 황신2259 11/06/06 2259
106637 이번주 금토일 기아 vs LG전 투수 로테이션을 알고 싶습니다.. [5] 나를찾아서1813 11/06/06 1813
106636 시험 보기 전에 머 먹으면 집중력이 높아질까요?? [3] 스타바보2080 11/06/06 2080
106634 향방작계훈련 질문입니다. [4] [RED]Sniper2098 11/06/06 2098
106633 중고나라 말고 타블렛 중고 거래가 많은 사이트나 카페 같은 곳 아시는지요. [1] 본호라이즌1517 11/06/06 1517
106632 모니터 질문입니다. T1577 11/06/06 1577
106631 휴대폰 관련 질문입니다. [7] 낡은 편지2224 11/06/06 2224
106630 안드로이드 어플 질문입니다. 아아아아1210 11/06/06 1210
106629 호주/뉴질랜드 여행 관련 사이트 추천해주세요! [1] Firehouse1829 11/06/06 1829
106628 일본 예능 찾아요 [3] 임요환의 DVD1752 11/06/06 1752
106627 예전에 본좌논쟁 과 관련한 글중에 기막힌 글이 있었는데..(이나라의 왕은 셋팅민 입니다.) [1] 다음세기2117 11/06/06 2117
106626 아이폰4가 이유도 모르고 고장이 났습니다. [10] cure2095 11/06/06 2095
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로