CGIとしてPythonを使用したときにSocket通信が通らない。
Posted: 2019年1月03日(木) 03:00
現在ApatcheサーバーにおいてCGIとしてPythonを利用し、Socket通信を用いてRaspberryPi(シングルボードコンピュータ)の遠隔操作を果たそうと考えているものです。
今回はCGIとしてsocketを用いるとデータが転送できないという問題があり、質問いたしました。
作成したプログラムの流れとしましては、Apacheサーバーにブラウザで接続し、表示される制御画面のボタンをクリックするとそれに対応した処理を起こすコードをsocketによりクライアントの端末に転送するというものです。
おそらく詳しい方であれば「処理が面倒であり、WebGpioを使用すればよい」と思われる事と思いますが、いかんせん私が端末間通信に慣れていないのもあり、グローバル環境下で動作し、ブラウザで使用できるものを、と考えるとこのようなサーバーにログインし、相手端末にコードを転送して制御するといったものになってしまいました。
(これともうひとつデータベースにIPを保持し、webgpioのページに直接リダイレクトさせるという方法も考えております。)
ここで今回の問題に至るのですが、サーバーおよびクライアント側のPythonプログラムをCGIではなく単体で実行すると動作したのですが、CGIとして実行するとsocket.socket()において何らかの異常が起こっている模様でサーバーにデータを転送できていない模様です。
(ブラウザの開発者画面ではエラーが現れていないが、そこより下の処理が実行されていない為。)
インターネット検索を行ってみたのですが情報もあまりなく途方に暮れている次第です。何故socketの生成が行えていないのでしょうか。
どなたか詳しい方がいらっしゃいましたらぜひとも助言をお願いいたします。
又、端末のグローバル制御をhtmlにて行う手法について詳しい方がいらっしゃる場合は、制御方法の助言もお願いいたします。
よろしくお願いします。
追記:
下記はプログラムになります。全てローカル環境下で試しました。ipはグローバルではないのですが一応伏字にいたしました。
クライアント側のプログラム
サーバー単体のプログラム
Apacheサーバー、制御画面
CGIとしてのクライアント
今回はCGIとしてsocketを用いるとデータが転送できないという問題があり、質問いたしました。
作成したプログラムの流れとしましては、Apacheサーバーにブラウザで接続し、表示される制御画面のボタンをクリックするとそれに対応した処理を起こすコードをsocketによりクライアントの端末に転送するというものです。
おそらく詳しい方であれば「処理が面倒であり、WebGpioを使用すればよい」と思われる事と思いますが、いかんせん私が端末間通信に慣れていないのもあり、グローバル環境下で動作し、ブラウザで使用できるものを、と考えるとこのようなサーバーにログインし、相手端末にコードを転送して制御するといったものになってしまいました。
(これともうひとつデータベースにIPを保持し、webgpioのページに直接リダイレクトさせるという方法も考えております。)
ここで今回の問題に至るのですが、サーバーおよびクライアント側のPythonプログラムをCGIではなく単体で実行すると動作したのですが、CGIとして実行するとsocket.socket()において何らかの異常が起こっている模様でサーバーにデータを転送できていない模様です。
(ブラウザの開発者画面ではエラーが現れていないが、そこより下の処理が実行されていない為。)
インターネット検索を行ってみたのですが情報もあまりなく途方に暮れている次第です。何故socketの生成が行えていないのでしょうか。
どなたか詳しい方がいらっしゃいましたらぜひとも助言をお願いいたします。
又、端末のグローバル制御をhtmlにて行う手法について詳しい方がいらっしゃる場合は、制御方法の助言もお願いいたします。
よろしくお願いします。
追記:
下記はプログラムになります。全てローカル環境下で試しました。ipはグローバルではないのですが一応伏字にいたしました。
クライアント側のプログラム
import socket
if __name__ == "__main__":
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(("ip_num", 50007))
s.listen(1)
while(True):
conn, addr = s.accept()
with conn:
while True:
data = conn.recv(1024)
print(data)
if not data:
break
if(int(data.decode(utf-8)) == 1):
#take action
print("action")
conn.sendall(b"you correctly transmitted data.")
import socket
while True:
word = input("enter: ")
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(("ip_num", 50007))
s.sendall(word.encode("utf-8"))
data = s.recv(-1)
print(repr(data))
<html>
<head>
<meta charset = "utf-8">
</head>
<body>
<center>
<font size=10>
WELCOME!!!
<br>
<form action="/cgi/control.py" method = "post">
<input type = "submit" name="handler" value="led">LED</input>>
</form>
</center>
</body>
</html>
#!/usr/bin/env python
# coding:utf-8
import cgi
import socket
print("Content-type: text-html\n\n")
form = cgi.FieldStorage()
if form["handler"].value == "led":
print("led turned on")
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(("ip_num", 50007))
s.sendall(word.encode("utf-8"))
data = s.recv(-1)
print(repr(data))