Networking Tutorial for iOSの勉強で躓いたこと その1

Networking Tutorial for iOS: How To Create A Socket Based iPhone App and Serverを学ぶ上で躓いたことのメモ その1。

主にpythonを使ってサーバーを構築する部分について。

  1. Twistedの導入
    チュートリアルでは、Twistedを使ったサーバーを構築するという。Twistedは古いmacOSには同梱されていたようだが、現在のmacOS Sierraには入っていない。

    1. pipの導入
      Twistedはpipを用いてインストールするらしい。ところが、

      which pip

      は何も返さない。ではpipはどうやって導入するかというと、

      sudo easy_install pip

      sudoを忘れると痛い目にあう。

    2. Twistedのインストール

      sudo pip install twisted
  2. server.pyの実行(失敗その1)
    コレでよかろうと、チュートリアルにある基本のきの字のserver.py

    from twisted.internet import reactor
    reactor.run()

    を書いて

    python server.py

    を叩くと、わらわらとエラーが出て最後に

    AttributeError: 'module' object has no attribute 'OP_NO_TLSv1_1'

    となる。これは、SSL関係のエラーらしい。ここに以下のようにしろと書いてあるので、

    sudo pip install -U Twisted[tls]

    と、やってみるが、次のエラーでコケる。もうヤダと思いつつ我慢して

    OSError: [Errno 1] Operation not permitted: '/tmp/pip-3ldlTB-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info'

    El Capitan以降のユーザーは、こうしろとここに書いてあった。

    sudo pip install -U Twisted[tls] --upgrade --ignore-installed six
  3. server.pyの実行(失敗その2)
    出来上がり品と思われるserver.py(以下)

    from twisted.internet.protocol import Factory, Protocol
    from twisted.internet import reactor
    
    class IphoneChat(Protocol):
        def connectionMade(self):
            print "a client connected"
    
    factory = Factory()
    factory.protocol = IphoneChat
    reactor.listenTCP(80, factory)
    print "Iphone Chat server started"
    reactor.run()
    python server.py

    とやると、以下のエラーが出る。

    twisted.internet.error.CannotListenError: Couldn't listen on any:80: [Errno 13] Permission denied.

    これもsudoの呪いだった。ところがsudo付きで実行すると、似たようなエラーを吐く。

    twisted.internet.error.CannotListenError: Couldn't listen on any:80: [Errno 48] Address already in use.

    これは、筆者がapacheを有効にしてあるため、80番ポートが使われているためだった。よって先のserver.pyを以下のように修正した。(参考

    reactor.listenTCP(8080, factory)
  4. server.pyの実行(成功)
    道は長かった。

    sudo python server.py

    これで

    Iphone Chat server started

    と、サーバーがスタートし、もう一つのターミナルウインドウから

    telnet localhost 8080

    と叩くと、

    Trying ::1...
    telnet: connect to address ::1: Connection refused
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.

    となった。サーバー側も、

    a client connected

    と表示された。

  5. Objective-Cのコードを書いて確認したときに発見した修正点

    def dataReceived(self, data):
        a = data.split(':')
        # print a

    print aをコメントアウト

    if command == "iam":
        self.name = content
        msg = self.name + " has joined"
        print msg

    print msgを追加

以上。

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL