Networking Tutorial for iOSの勉強で躓いたこと その1
Networking Tutorial for iOS: How To Create A Socket Based iPhone App and Serverを学ぶ上で躓いたことのメモ その1。
主にpythonを使ってサーバーを構築する部分について。
-
Twistedの導入
チュートリアルでは、Twistedを使ったサーバーを構築するという。Twistedは古いmacOSには同梱されていたようだが、現在のmacOS Sierraには入っていない。-
pipの導入
Twistedはpipを用いてインストールするらしい。ところが、which pip
は何も返さない。ではpipはどうやって導入するかというと、
sudo easy_install pip
sudo
を忘れると痛い目にあう。 -
Twistedのインストール
sudo pip install twisted
-
pipの導入
-
server.pyの実行(失敗その1)
コレでよかろうと、チュートリアルにある基本のきの字のserver.pyfrom 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
-
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)
-
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
と表示された。
-
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
この投稿へのコメント