Flashで作られたVNCクライアントのFlashLight-VNCを試す

タイトルの通り。
Open Source VNC Client in Flash
キーボード入力に問題がある(入力したキーの文字にならない)ぐらい。
とりあえずマウス操作は大丈夫そう。


動かす際に、セキュリティポリシーを取得するためのサーバをリモート側で実行しないといけないのが少し面倒。
jarファイルが配布されてたけど、動かすのが少し面倒だったのでPythonでそれっぽいものを書いた。

policyserver.py

#!/usr/bin/env python
import sys
import socket
from optparse import OptionParser

POLICY_DATA = """<?xml version="1.0"?>
<cross-domain-policy>
    <site-control permitted-cross-domain-policies="all"/>
    <allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>"""

DEFAULT_ADDR = '0.0.0.0'
DEFAULT_PORT = 1234

RECV_SIZE = 1024


class PolicyServer(object):
    def __init__(self, bind_address, bind_port, backlog=None):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.bind_address = bind_address
        self.bind_port = bind_port
        self.backlog = backlog or 1

    def start(self):
        self.socket.bind((self.bind_address, self.bind_port))
        self.socket.listen(self.backlog)
        try:
            while True:
                connection, address = self.socket.accept()
                try:
                    self.handle(connection, address)
                finally:
                    connection.close()
        except KeyboardInterrupt:
            sys.exit()

    def handle(self, connection, address):
        sys.stdout.write('CONNECT from %s\n' % address[0])
        data = connection.recv(RECV_SIZE)
        sys.stdout.write('recv data %d bytes from %s\n' % (
            len(data), address[0]))
        connection.send(POLICY_DATA)


class PolicyServerCommand(object):
    SERVER_CLASS = PolicyServer

    def __init__(self):
        self.parser = OptionParser()

        self.parser.add_option(
            '--address',
            dest='address',
            default=DEFAULT_ADDR,
            help='bind address')

        self.parser.add_option(
            '--port',
            dest='port',
            default=DEFAULT_PORT,
            type='int',
            help='port number')

    def main(self):
        options, args = self.parser.parse_args()
        bind_address = options.address
        bind_port = options.port
        self.server = self.SERVER_CLASS(bind_address, bind_port)
        sys.stdout.write('Starting policyserver addr=%s, port=%s ...\n' % (
            bind_address, bind_port))
        self.server.start()


if __name__ == '__main__':
    PolicyServerCommand().main()

悩みどころ。