6

Python で JavaScript コードからクエリを実行したいと考えています。しかし、私はこの分野の経験がまったくありません。私が構築したいのは、次のようなものです。

1.request.js :

open_connection('server.py');
for (var i=0; i<10; i++)
    document.write(request_next_number());
close_connection('server.py')

2.サーバー.py

x = 0
while connected:
    if request:
        send(x)
        x = x + 1

JSON について聞いたことがありますが、使用する必要があるかどうかわかりません。(?)

上記の 2 つのファイルを実装する方法のコード例またはガイドを教えてください。

4

2 に答える 2

9

必要なのは、エンドのソケット サーバーpythonと JavaScript エンドのクライアント/リクエスト サーバーです。

Python サーバー側についてはSocketServer、(そこから取られた例も) を参照してください。確認しなければならないことの 1 つは、ソケットを通過させることですNAT(おそらくポート フォワーディング)。もう1つの選択肢はTwisted、非常に強力なフレームワークです。データを送信する機能があると思いますNAT.

import SocketServer

class MyTCPHandler(SocketServer.BaseRequestHandler):
    """
    The RequestHandler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """

    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        print "{} wrote:".format(self.client_address[0])
        print self.data
        # just send back the same data, but upper-cased
        self.request.sendall(self.data.upper())

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999

    # Create the server, binding to localhost on port 9999
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    server.serve_forever()

ソケット接続を許可するJavaScriptフレームワークは多数あります。

例:

<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

例:

var connection = new WebSocket('ws://IPAddress:Port');
connection.onopen = function () {
  connection.send('Ping'); // Send the message 'Ping' to the server
};
  • また、この本の一部、 の第 22 章を見てJavascript: The Definitive Guideください

  • 最後に、ご覧くださいjssockets

例:

_jssocket.setCallBack(event, callback);
_jssocket.connect(ip,port);
_jssocket.write(message);
_jssocket.disconnect();

この助けを願っています!

于 2013-08-14T17:18:29.910 に答える
3

画像をWebサーバーに転送して画面をストリーミングするために使用したWeb Socketの例。

stream.html

<!DOCTYPE HTML>
<meta charset = utf-8>

<html>
    <header>
        <title>Stream</title>
        <script type="text/javascript" src="js/request.js"></script>
    </header>
    <body onload="doLoad()">
        <div id="canvasWrapper">
            <canvas id="display"></canvas>
        </div>
    </body>
</html>

request.js

var disp;
var dispCtx;
var im;
var ws;

function doLoad() {
    disp = document.getElementById("display");
    dispCtx = disp.getContext("2d");
    im = new Image();
    im.onload = function() {
    disp.setAttribute("width", im.width);
    disp.setAttribute("height", im.height);
    dispCtx.drawImage(this, 0, 0);
  };
    im.src = "img/img_not_found.png";
    ws = new WebSocket("ws://127.0.0.1:50007");
    ws.onmessage = function (evt) {
        im.src = "data:image/png;base64," + evt.data;
    }
}

サーバー.py

from autobahn.twisted.websocket import WebSocketServerProtocol, WebSocketServerFactory
import base64
import sys
from twisted.python import log
from twisted.internet import reactor

class MyServerProtocol(WebSocketServerProtocol):

    def onConnect(self, request):
        print("Client connecting: {}".format(request.peer))

    def onOpen(self):
        print("WebSocket connection open.")

        def hello():
            with open("/var/www/html/img/image.png", "rb") as image_file:
                encoded_string = base64.b64encode(image_file.read())
            self.sendMessage(encoded_string.encode('utf8'))
            self.factory.reactor.callLater(0.2, hello)

        # start sending messages every 20ms ..
        hello()

    def onMessage(self, payload, isBinary):
        if isBinary:
            print("Binary message received: {} bytes".format(len(payload)))
        else:
            print("Text message received: {}".format(payload.decode('utf8')))

        # echo back message verbatim
        self.sendMessage(payload, isBinary)

    def onClose(self, wasClean, code, reason):
        print("WebSocket connection closed: {}".format(reason))


if __name__ == '__main__':
    log.startLogging(sys.stdout)

    factory = WebSocketServerFactory(u"ws://127.0.0.1:50007")
    factory.protocol = MyServerProtocol
    # factory.setProtocolOptions(maxConnections=2)

    # note to self: if using putChild, the child must be bytes...

    reactor.listenTCP(50007, factory)
    reactor.run()

アウトバーンが必要です(でインストールできますpip install autobahn)

于 2016-07-21T14:37:29.970 に答える