Python入門(十五)socketプログラミング

2232 ワード

Socketネットワークプログラミングのコードを書いたことがあります.tcpサーバの主なステップは、socket->bind-->listen-->accept-->recv/send-->closeです.tcpクライアントの主なステップは、socket->connect-->recv/send-->closeです.上記のことを知っていると、Pythonのsocketプログラミングも似ているような気がします.
echoサービスを例に説明します.
1)まずサービス側のコード:
# This is a echo server.

import socket
import sys

try:
    #1. create socket
    serv_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
    print("socket failed")
    sys.exit(-1)

print("socket success")

# serv_addr = ('127.0.0.1', 8080)
host = ''
port = 8000
#2. bind to 8000 port and listen
serv_sock.bind((host, port))
serv_sock.listen(5)

while True:
    #3. accept connection from client
    client_sock, client_addr = serv_sock.accept()
    print("connected by ", client_addr)
    while True:
        buf = client_sock.recv(10240)
        if not buf:
            print("Exit", client_addr)
            client_sock.close()
            break
        else:           
            print("recv from client: ", buf)
            client_sock.send(buf)

2)echoクライアントコード:
# This is a echo client.

import socket
import sys

try:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
    print('socket failed!')
    sys.exit(-1)
print("socket success")

# serv_addr = ('127.0.0.1', 8080)
host = '127.0.0.1'
port = 8000

try:
    sock.connect((host, port))
except socket.error:
    print("connect %s failed" % host)
    sys.exit(-1)

while True:
    try:
        #message = "hello"
        message = input(">>")
        if not message:      
            break
        else:
            sock.sendall(message.encode('utf8'))
            reply = sock.recv(10240)
            print('reply: %s' % reply.decode('utf8'))
    except EOFError:
        print("EOF
")         break print("Exit...") #sock.shutdown(socket.SHUT_RDWR) sock.close()

上記は単純なechoサービスであり,socketモジュールにおけるソケットプログラミングに関する方法を簡単に示した.
実際のネットワーク開発では,主なモデルとして,マルチプロセス,マルチスレッド,イベント駆動select/epoll,非同期非ブロックがある.これらは後の文章でそれぞれ説明します.