28
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PythonでTCP通信(サーバ編)

Last updated at Posted at 2019-02-19

はじめに

今更だがPythonの勉強なう
一人でコードを書いていてもむなしいため共有することにする

今回はPythonのsocketライブラリを使用してTCPサーバをつくる
別にTCPクライアントもつくるので、サーバ <-> クライアント間で通信させて遊んでみる

クライアント編は以下に
https://qiita.com/keiusukematsuda/items/362450fda4beca76c030

環境

  • CentOS7
  • Python3.6

コードを書く

クライアントからデータを受信して、それを標準出力に表示させる
またデータを受信したらクライアントに返信する


# -*- coding : UTF-8 -*-

# 0.ライブラリのインポートと変数定義
import socket

server_ip = "127.0.0.1"
server_port = 8080
listen_num = 5
buffer_size = 1024

# 1.ソケットオブジェクトの作成
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2.作成したソケットオブジェクトにIPアドレスとポートを紐づける
tcp_server.bind((server_ip, server_port))

# 3.作成したオブジェクトを接続可能状態にする
tcp_server.listen(listen_num)

# 4.ループして接続を待ち続ける
while True:
    # 5.クライアントと接続する
    client,address = tcp_server.accept()
    print("[*] Connected!! [ Source : {}]".format(address))

    # 6.データを受信する
    data = client.recv(buffer_size)
    print("[*] Received Data : {}".format(data))

    # 7.クライアントへデータを返す
    client.send(b"ACK!!")

    # 8.接続を終了させる
    client.close()

たったのこれだけ
とても簡単でございます

コードの解説

####0.ライブラリのインポートと変数定義
socketライブラリを使用するのでインポートする
通信を待ち受けるアドレスとポートは変数化しておく、今回は同一ホスト内でクライアント <-> サーバ通信をさせるためにループバックアドレスを使用する

####1.ソケットオブジェクトの作成
socket関数を使用してソケットオブジェクトを作成する
第一引数にsocket.AF_INETを渡すことで作成するソケットオブジェクトはIPv4に対応する
また第二引数にsocket.STREAMを渡すことでTCPに対応する
つまり今回作成するソケットはIPv4でTCP通信を行うソケットになる
UDPに対応したソケットオブジェクトを作成したい場合は第二引数にsocket.DGRAMを渡せばよい

####2.作成したソケットオブジェクトにIPアドレスとポートを紐づける
bind関数でオブジェクトにアドレスとポートを紐づける
引数にはタプルを渡すため()が二重になることに注意する

####3.作成したオブジェクトを接続可能状態にする
listen関数を使用してソケットオブジェクトに接続できる状態にする
この時引数には整数を渡す、これはソケットオブジェクトに接続できるコネクション数の最大値となる

####4.ループして接続を待ち続ける
特に言うことなし(^^)

####5.クライアントと接続する
accept関数によりクライアントからデータの送受信を行うための新しいソケットオブジェクトとデータの送信元であるクライアントのアドレスを受け取る
送信元アドレスを標準出力に出力させる

####6.データを受信する
新しく作成したソケットオブジェクトのrecv関数でクライアントからデータを受信する
引数に一度に受信できるデータサイズの最大値を渡す
今回は1024byteを最大値とする

####7.クライアントへデータを返す
クライアントにデータを送信する
引数は送信するデータをbyte型として渡す

動作確認

クライアント編でやるので見てくださいませ!

とりあえず今回はここまで!おつかれちゃん!

28
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?