Python 핵심 프로 그래 밍 연습 문제 의 2 - 네트워크 프로 그래 밍

10544 단어
1. 연결 을 위 한 소켓 과 연결 되 지 않 은 소켓 의 차 이 는 무엇 입 니까?
  • 소켓 은 컴퓨터 네트워크 데이터 구조 로 소켓 은 처음에 같은 호스트 의 응용 프로그램 에 의 해 만들어 져 호스트 의 서로 다른 응용 프로그램 이 서로 통신 할 수 있 게 되 었 다. 이것 이 바로 프로 세 스 간 통신 (Inter Process Communication, IPC)
  • 이다.
    연결 을 위 한 소켓
    연결 되 지 않 은 소켓
    통신 하기 전에 반드시 연결 을 세 워 야 한다
    통신 하기 전에 연결 을 만 들 필요 가 없습니다.
    직렬 화 된 신뢰 할 수 있 는 중복 되 지 않 는 데이터 전달
    순서 성, 신뢰성 또는 중복 성 을 보장 할 수 없 으 며, 일정한 비용 으로 줄 일 수 없다.
    기록 경계 없 음
    기록 경계 저장
    모든 정 보 는 여러 부분 으로 나 눌 수 있 고 모든 메시지 부분 은 목적지 에 도착 할 수 있 도록 확보 한 다음 에 그 를 순서대로 조합 할 수 있다.
    소식 은 전체적으로 발송 된다.
    전송 제어 프로 토 콜 (TCP)
    사용자 데이터 프로 토 콜 (UDP)
    2. 클 라 이언 트 / 서버 구조
  • 서버 는 일련의 하드웨어 나 소프트웨어 로 하나 이상 의 클 라 이언 트 (서비스의 사용자) 에 게 필요 한 '서비스' 를 제공한다.그 존재 목적 은 클 라 이언 트 의 요청 을 기다 리 고 그들 에 게 응답 한 다음 에 더 많은 요청 을 기다 리 는 것 이다.

  • 3. TCP 와 UDP 에서 어떤 유형의 서버 가 연결 을 받 고 그들 을 독립 된 소켓 으로 전환 시 켜 클 라 이언 트 통신 을 합 니까?
    TCP
    

    4. TCP (tsTclnt. py) 와 UDP (tsUclnt. py) 클 라 이언 트 를 업데이트 하여 서버 이름 을 프로그램 에 하 드 코딩 하지 않 아 도 됩 니 다.
    if __name__ == '__main__':
        opts, args = getopt.getopt(sys.argv[1:],'',['host=','port='])
        for op, value in opts:
            if op == '--host':
                HOST = value
            elif op == '--port':
                PORT = value
    

    프로그램 에 이 코드 를 추가 하면 명령 을 입력 하여 지정 한 host 와 port 를 진행 할 수 있 습 니 다.
    5. TCP 클 라 이언 트 / 서버 프로그램 을 작성 하여 서버 가 다음 명령 을 식별 할 수 있 도록 합 니 다.
  • date 서버 는 현재 날짜 / 시간 스탬프, 즉 time. ctime ()
  • 를 되 돌려 줍 니 다.
  • os 운영 체제 정보 획득 (os. name)
  • ls 는 현재 디 렉 터 리 파일 목록 을 보 여 줍 니 다 (알림: os. listdir () 는 디 렉 터 리 를 보 여 줍 니 다. os. curdir () 는 현재 디 렉 터 리 입 니 다)
  • tcp_server. py (서버 엔 드 코드)
    import socket
    from time import ctime
    import os
    import re
    
    HOST = ''
    PORT = 50006
    ADDR = (HOST, PORT)
    
    #           ,         
    def list_dir(path = os.curdir):
        files = os.listdir(path)
        filenames = []
        for file in files:
            filenames.append(file)
        return '
    '.join(filenames) with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind(ADDR) s.listen(5) while True: conn, addr = s.accept() with conn: print('Connected by', addr) while True: data = conn.recv(1024) s_data = '' if not data: break data = data.decode('utf-8') # time if data == 'time': s_data = '[%s]'%ctime() # os elif data == 'os': s_data = '[%s]'%os.name else: # ls if data == 'ls': s_data = list_dir() else: # ls path patt = 'ls\s([^\s]+)' m = re.match(patt,data) if m: path = m.group(1) if os.path.exists(path): s_data = list_dir(path) else: s_data = 'not exist path' else: s_data = 'this is no order' + data conn.send(s_data.encode('utf-8'))

    tcp_clnt. py (클 라 이언 트 코드)
    import socket
    
    HOST = 'localhost'
    PORT = 50006
    ADDR = (HOST, PORT)
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect(ADDR)
        while True:
            data = input('>>> ')
            if not data:break
            s.send(data.encode('utf-8'))
            data = s.recv(1024)
            if not data:break
            data = data.decode('utf-8')
            print(data)
    

    6. 세 미 듀 플 렉 스 채 팅
    hdserver. py (듀 플 렉 스 채 팅 서버)
    from socket import *
    
    HOST = ''
    PORT = 50006
    BUFSIZE = 1024
    ADDR = (HOST, PORT)
    
    with socket(AF_INET, SOCK_STREAM) as s:
        s.bind(ADDR)
        s.listen(5)
        while True:
            conn, addr = s.accept()
            with conn:
                print('connected by ',addr)
                while True:
                    data = conn.recv(BUFSIZE)
                    if not data:break
                    print('from:',data.decode('utf-8'))
                    data = input('to: ')
                    if not data:break
                    conn.send(data.encode('utf-8'))
    

    hdclnt. py (반 양 방향 채 팅 클 라 이언 트)
    from socket import *
    
    HOST = 'localhost'
    POST = 50006
    BUFSIZE = 1024
    ADDR = (HOST, POST)
    
    with socket(AF_INET, SOCK_STREAM) as s:
        s.connect(ADDR)
        while True:
            data = input('to: ')
            if not data:break
            s.send(data.encode('utf-8'))
            data = s.recv(BUFSIZE)
            print('from: ',(data.decode('utf-8')))
    

    7. 듀 플 렉 스 채 팅
    fdserver. py (듀 플 렉 스 서버)
    from socket import *
    from select import *
    import sys
    
    HOST = ''
    PORT = 50007
    BUFSIZE = 1024
    ADDR = (HOST, PORT)
    
    with socket(AF_INET, SOCK_STREAM) as tcp_server:
        tcp_server.bind(ADDR)
        tcp_server.listen(5)
        inpu = [tcp_server, sys.stdin]
        while True:
            conn, addr = tcp_server.accept()
            inpu.append(conn)
            while True:
                r_list, w_list,e_list = select(inpu,[],[])
                for s in r_list:
                    if s == conn:
                        data = conn.recv(BUFSIZE)
                        if not data: break
                        print(data.decode('utf-8'))
                    else:
                        data = input('>>> ')
                        if not data: break
                        conn.send(data.encode('utf-8'))
    

    fdclnt. py (듀 플 렉 스 채 팅 클 라 이언 트)
    from socket import *
    from select import *
    import sys
    
    HOST = 'localhost'
    POST = 50007
    BUFSIZE = 1024
    ADDR = (HOST, POST)
    
    with socket(AF_INET, SOCK_STREAM) as tcp_clnt:
        tcp_clnt.connect(ADDR)
        inpu = [tcp_clnt,sys.stdin]
        while True:
            r_list, w_list, e_list = select(inpu,[],[])
            for s in r_list:
                if s == tcp_clnt:
                    data = tcp_clnt.recv(BUFSIZE)
                    if not data: break
                    print((data.decode('utf-8')))
                else:
                    data = input('>>> ')
                    if not data:break
                    tcp_clnt.send(data.encode('utf-8'))
    

    8. 다 중 사용자 쌍방 향 채 팅
    mfd_server (다 중 사용자 듀 플 렉 스 채 팅 서버 쪽)
    from socket import *
    import threading
    
    HOST = ''
    PORT = 21568
    BUFSIZE = 1024
    ADDR = (HOST, PORT)
    
    conns = []
    
    #      ,         
    def deal_conn(conn):
        while True:
            data = conn.recv(BUFSIZE)
            if not data:break
            for c in conns:
                if c != conn:
                    c.send(data)
    
    with socket(AF_INET, SOCK_STREAM) as server:
        server.bind(ADDR)
        server.listen(10)
        while True:
            conn, addr = server.accept()
            #               
            if conn not in conns:
                for c in conns:
                    greet = '  %s        !' %str(addr)
                    c.send(greet.encode('utf-8'))
                conns.append(conn)
            t = threading.Thread(target=deal_conn,args=(conn,))
            t.start()
    

    mfd_clnt. py (다 중 사용자 듀 플 렉 스 채 팅 클 라 이언 트)
    from socket import *
    from select import *
    import sys
    
    HOST = 'localhost'
    POST = 21568
    BUFSIZE = 1024
    ADDR = (HOST, POST)
    
    with socket(AF_INET, SOCK_STREAM) as server:
        server.connect(ADDR)
        inpu = [server,sys.stdin]
        while True:
            r_list, w_list, e_list = select(inpu,[],[])
            for s in r_list:
                if s == server:
                    data = server.recv(BUFSIZE)
                    if not data: break
                    print((data.decode('utf-8')))
                else:
                    data = input('>>> ')
                    if not data:break
                    server.send(data.encode('utf-8'))
    

    9. 다 중 사용자, 다 중 방, 듀 플 렉 스 채 팅 \ # \ # \ # \ # \ # \ # # # mmfdserver (다 중 사용자 다 중 방 전 쌍 작업 채 팅)
    from socket import *
    import re
    import threading
    
    HOST = ''
    PORT = 21568
    BUFSIZE = 1024
    ADDR = (HOST, PORT)
    
    rooms = {}
    conns = {}
    
    REFUSE = '      ,        '.encode('utf-8')
    WAITING = '       '.encode('utf-8')
    INPUT_ERROR = '      '.encode('utf-8')
    
    
    def deal_conn(name):
        while True:
            conn_from = conns[name]
            data = conn_from.recv(BUFSIZE)
            if not data:break
            if rooms[name] in conns:
                conn_to = conns[rooms[name]]
                conn_to.send(data)
            else:
                conn_from.send(WAITING)
    
    with socket(AF_INET, SOCK_STREAM) as server:
        server.bind(ADDR)
        server.listen(10)
        while True:
            conn, addr = server.accept()
            settings = conn.recv(BUFSIZE)
            patt = r'name:(.+)\sto:(.+)'
            m = re.match(patt,settings.decode('utf-8'))
            if not m:conn.send(INPUT_ERROR)
            name = m.group(1)
            if name not in conns:
                conns[name] = conn
    
            to = m.group(2)
            if name not in rooms and to not in rooms:
                rooms[name] = to
                rooms[to] = name
            elif name in rooms and rooms[name] != to:
                del conns[name]
                if name in rooms:
                    del rooms[name]
                conn.send(REFUSE)
                conn.close()
    
            t = threading.Thread(target=deal_conn,args=(name,))
            t.start()
    

    mmfd_clnt (다 중 사용자 다 중 방 전 쌍 작업 채 팅)
    from socket import *
    from select import *
    import sys
    
    HOST = 'localhost'
    POST = 21568
    BUFSIZE = 1024
    ADDR = (HOST, POST)
    
    with socket(AF_INET, SOCK_STREAM) as server:
        server.connect(ADDR)
        inpu = [server,sys.stdin]
        print("             (  name:     to:    )")
        data = input('')
        server.send(data.encode('utf-8'))
        while True:
            r_list, w_list, e_list = select(inpu,[],[])
            for s in r_list:
                if s == server:
                    data = server.recv(BUFSIZE)
                    if not data: break
                    print((data.decode('utf-8')))
                else:
                    data = input('>>> ')
                    if not data:break
                    server.send(data.encode('utf-8'))
    

    좋은 웹페이지 즐겨찾기