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 件のコメント:
コメントを投稿