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 pipsudo
を忘れると痛い目にあう。 -
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 aprint a
をコメントアウトif command == "iam": self.name = content msg = self.name + " has joined" print msgprint msg
を追加
以上。
この投稿へのトラックバック
トラックバックはありません。
- トラックバック URL
この投稿へのコメント