質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.95%

pyrhonでソケット(socket)通信を実行したい

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 363
退会済みユーザー

退会済みユーザー

よろしくお願いします。
pythonでソケット通信を体験したいと思い、https://qiita.com/init/items/d83b6f23b53e56417702からプログラムをコピペして動かしてみたのですがエラーが出ます。

該当のソースコード

import socket
import threading


class SocketServer():
    def __init__(self):
        self.host = socket.gethostname()
        self.port = 50007
        self.clients = []

    def socket_server_up(self):
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.bind((self.host, self.port))
        sock.listen(5)
        while True:
            try:
                conn, addr = sock.accept()
            except KeyboardInterrupt:
                break
            print("[接続]{}".format(addr))
            self.clients.append((conn, addr))
            thread = threading.Thread(target=self.handler, args=(conn, addr), daemon=True)
            thread.start()

    def close_connection(self, conn, addr):
        print('[切断]{}'.format(addr))
        conn.close()
        self.clients.remove((conn, addr))

    def handler(self, conn, addr):
        while True:
            try:
                data = conn.recv(1024)
            except ConnectionResetError:
                self.close_connection(conn, addr)
                break

            if not data:
                self.close_connection(conn, addr)
                break
            else:
                print('data : {}, addr&port: {}'.format(data, addr))
                for client in self.clients:
                    try:
                        client[0].sendto(data, client[1])
                    except ConnectionResetError:
                        break


if __name__ == "__main__":
    ss = SocketServer()
    ss.socket_server_up()

発生している問題・エラーメッセージ

Traceback (most recent call last):
  File "socket_server.py", line 52, in <module>
    ss.socket_server_up()
  File "socket_server.py", line 13, in socket_server_up
    sock.bind((self.host, self.port))
socket.gaierror: [Errno 8] nodename nor servname provided, or not known

補足情報(FW/ツールのバージョンなど)

バージョン:Python 3.6.5
エディタ:visual studio code
投稿主さんのOShWindows、私はMacOSです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2019/09/01 08:50

    このままではコードが読めないので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/09/01 09:15

    訂正依頼ありがとうございます。

    キャンセル

回答 3

+1

pythonでソケット通信を体験したいと思い、

「体験」が目的であれば、自分の環境にあったプログラムを探しましょう。
「学習」が目的であれば、コピペするだけじゃなくて、自分で考えましょう。

おそらく、gethostname()がうまくいってないか、その先のgethostbyname()がうまくいってないと思われます。

「体験」が目的であれば、self.hostの代わりに"0.0.0.0"を指定すればいいかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

大抵ことは、エラーメッセージをそのまま検索すれば、答えが出てきます。
socketでのbindでエラー

ちなみに、検索結果

追記
エラーとは、「誤り、間違い」という意味です。ですから、エラーが出ているところに間違いがあるのは、ほぼ確実です。
メッセージとは、「伝言、伝達事項」という意味です。エラーの内容、場合によっては原因をあなたに伝えるために書かれています。
ですから、まずはエラーメッセージを読みましょう。
エラーメッセージは「socket.gaierror: [Errno 8] nodename nor servname provided, or not known」ですが、「ノード名、サーバー名が指定されていない、または不明」ということです。ここから「(self.host, self.port) に何か問題がある」とわかります。
ということは、これらの値を確認することが必要です。

print((self.host, self.port)) # この行を追加
sock.bind((self.host, self.port))


これで内容を確認して、何がおかしいのかを特定し、それをただす方法を考えます。
今の時点では原因不明なのでここまで。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/01 09:19

    すみません。
    検索してはみたのですが、まだプログラミングがわからないところが多く理解できない部分が多かったためこのような質問という形で調べさしていただきました。
    つきましては、もし訂正する箇所がわかっているのなら教えてもらいたいです。

    キャンセル

  • 2019/09/01 09:24

    貼り付けた先の質問の答えで、何がわからない、理解できないのでしょうか。「理解するつもりがありません」ではないのなら、「この部分がわからない」という聞き方をしてください。
    私は、「なぜエラーになっているのか」「どうすればエラーの原因であると確認できるか」「対象方法」が書かれてあると理解したので、貼り付けました。私も、同じように回答するでしょう。では、何がわからないのでしょうか。それに応えていただけないと、私には答えられません。

    キャンセル

  • 2019/09/01 09:28

    度々失礼わかりにくい文章ですみません。
    「この部分がわからない」などではなく「何が間違っているかどこが間違っているかもわからない状況」です。わざわざ回答していただいているのに適切な文章でないこと申し訳ありません。

    キャンセル

0

socket.gaierror: [Errno 8] 指定されたノード名またはサーバー名、または不明

ということなので、
self.hostに何が入ってるのか見てみることでしょうね。
そのナカミは存在するホスト名なんでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.95%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる