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