2019年9月22日日曜日

python ソケット通信(TCP/IP)でチャット


pythonでチャットプログラムを作成しました。
もちろん以下サイト参考というかほとんど丸写し。
わからない点があったので他サイトも参考にしました。
単純のプログラムなので、著作権はないと思いますので、そのまま掲載します。



【Python】ソケット通信(TCP/IP)でチャット

https://algorithm.joho.info/programming/python/socket-tcp-ip-chat-1-on-1/


サーバー側
#!/usr/bin/env python
#coding:utf-8

#ファイル名 chat_server.py

"""
参考サイト 
西住工房@技術雑記
https://algorithm.joho.info/programming/python/socket-tcp-ip-chat-1-on-1/
【Python】socket通信を行う – UDP, TCP
https://code-graffiti.com/socket-communication-in-python/

18.1. socket — 低水準ネットワークインターフェー
https://docs.python.org/ja/3.5/library/socket.html

pythonでsocket通信を勉強しよう
https://qiita.com/__init__/items/5c89fa5b37b8c5ed32a4
*socket*
アドレスファミリ
アドレスファミリは、ソケットが利用できるアドレス体系を示すものだ。

アドレスファミリ        意味
AF_INET                         IPv4 によるソケット
AF_INET6                        IPv6 によるソケット
AF_UNIX                         ローカルなプロセス間通信用のソケット
AF_INET                         デバイスレベルのパケットインターフェース
ソケットタイプ
ソケットタイプは、ソケットの性質を表す。
ソケットタイプ  意味
SOCK_STREAM   
順序性と信頼性があり、双方向の接続されたバイトストリーム
(byte stream)を提供する(TCP)
SOCK_DGRAM   
データグラム(接続、信頼性なし、固定最大長メッセージ)をサ
ポートする(UDP)

このソケットタイプとアドレスファミリの組み合わせて、通信方式を決定する
"""
import socket
def main():
    #socket.socket()でソケットを作ります。AF_INETはインターネット接続
    #を示し、SOCK_DGRAMはUDP接続をサポートするソケットタイプです。
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    #指定したホスト(IP)とポートをソケットに設定
    #localhost:サーバー名 50007:ポート番号
    #*bind*()でサーバーのIPを指定し届いたあらゆるデータを結びつけま
    #す(リスンします)。バインドすると言ったりします。サーバーとポー
    #ト 番号はローカルサーバーなので(‘127.0.0.1’, 50000)とここではして
    #おきます。
    s.bind(("localhost", 50007))
    #*listen*引数が1なので 一つの接続要求を待つ
    s.listen(1)

    #要求が来るまでブロック
    #*accept*でクライアントの接続を受け付ける
    #(clientsocket, address) = serversocket.accept()
    #サーバ側プログラムが accept()を実行すると、クライアント側からの通
    #信接続要求が来るまで プログラムが停止し、接続語にプログラムを再開
    #します。つまり、通信接続要求 が来るとaccept()が終了し、次の処理に
    #移ることができるように なります。

    #socket.accept()
    #接続を受け付けます。ソケットはアドレスにbind済みでlisten中である
    #必要があります。戻り値は (conn, address) のペアで、 conn は接続を
    #通じてデータの送受信を行うための 新しい ソケットオブジェクト、
    #address は接続先でソケットにbindしているアドレスを示します。
    soc, addr = s.accept()

    #サーバー側の合図
    print("Connetde by"+str(addr))

    #サーバでは sendall() / recv()メソッドは listen 中のソケットで実
    #行するのではなく、 accept()で取得したソケットに対して実行してい
    #る点にも注意してください。
    while(1):
        #入力待機
        #data = input("Server>")
        data = raw_input("Server>")

        #*send*ソケットにデータを送信
        soc.send(data)

        #*recv*データを受信(1024バイトまで)
        data = soc.recv(1024)
        #サーバー側の書き込みを表示
        print("Client>", data)

        #qが押されたら終了
        if data == "q":
            soc.close()
            break

    #s.close()はいらないのだろうか?
    #別につけても正常に動作した。
    s.close()

main()



クライアント側

#!/usr/bin/env python
#coding:utf-8

#ファイル名 chat_client.py

#参考サイト 
#西住工房@技術雑記
#https://algorithm.joho.info/programming/python/socket-tcp-ip-chat-1-on-1/

import socket

def main():
    soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #クライアント側では、ソケットにconnectメソッドを実行すると、指定
    #したサーバに接続を試みます。
    soc.connect(("localhost", 50007))

    while(1):
        #サーバーからのデータを受信
        data = soc.recv(1024)
        #サーバーの書き込みを表示
        print("Server>", data)

        #入力待機
        #data = input("Client>")
        data = raw_input("Client>")
        #ソケットに入力したデータを送信
        soc.send(data)

        if data == "q":
            soc.close()
            break
main()


0 件のコメント:

コメントを投稿

About

参加ユーザー

連絡フォーム

名前

メール *

メッセージ *

ページ

Featured Posts