Python 핵심 프로 그래 밍 연습 문제 의 2 - 네트워크 프로 그래 밍
연결 을 위 한 소켓
연결 되 지 않 은 소켓
통신 하기 전에 반드시 연결 을 세 워 야 한다
통신 하기 전에 연결 을 만 들 필요 가 없습니다.
직렬 화 된 신뢰 할 수 있 는 중복 되 지 않 는 데이터 전달
순서 성, 신뢰성 또는 중복 성 을 보장 할 수 없 으 며, 일정한 비용 으로 줄 일 수 없다.
기록 경계 없 음
기록 경계 저장
모든 정 보 는 여러 부분 으로 나 눌 수 있 고 모든 메시지 부분 은 목적지 에 도착 할 수 있 도록 확보 한 다음 에 그 를 순서대로 조합 할 수 있다.
소식 은 전체적으로 발송 된다.
전송 제어 프로 토 콜 (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 클 라 이언 트 / 서버 프로그램 을 작성 하여 서버 가 다음 명령 을 식별 할 수 있 도록 합 니 다.
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'))
                이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.