用于在端口上提供xml文件的Python脚本不工作

2024-04-24 09:41:26 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,为了简单起见,我在同一个文件夹中有一个文件名为flashpolicy.xml我想在843号港服务。我完全没有使用python的经验,但是我已经做过一些其他语言的工作,这是我最近尝试合并其他人的代码并尝试使其工作。我现在可以运行这个脚本,它将正确注册服务,我可以启动服务,如果我做netstat-na,我会看到正确的端口正在监听。错误日志指示在我的版本中运行的最后一行是: thread.start_new_线程(自我控制, self.sock.接受())


import pythoncom
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import sys
import optparse
import thread
import exceptions
import contextlib
import logging


class AppServerSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "flaspsrv"
    _svc_display_name_ = "Flash Policy Server"
    _svc_description_ = "Initialize Flash Policy Server"

    def __init__(self,args):
        logging.basicConfig(filename='C:\\Uploads\\testing.log', level=logging.DEBUG, filemode='a', format='%(asctime)s %(levelname)s %(message)s')
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.hWaitStop = win32event.CreateEvent(None,0,0,None)
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_,''))
        self.main()

    def main(self):
        try:
            self.sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
        except AttributeError:
            # AttributeError catches Python built without IPv6
            self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        except socket.error:
            # socket.error catches OS with IPv6 disabled
            self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            logging.info('Listening on port 843')
            self.sock.bind(('', 843))
            self.sock.listen(5)

        try:
            while True:
                thread.start_new_thread(self.handle, self.sock.accept())
        except socket.error, e:
            logging.info('Error accepting connection: %s' % (e[1],))

    def handle(self, conn, addr):
        logging.info('Temp2')
        addrstr = '%s:%s' % (addr[0],addr[1])
        try:
            logging.info('Connection from %s' % (addrstr,))
            with contextlib.closing(conn):
                # It's possible that we won't get the entire request in
                # a single recv, but very unlikely.
                request = conn.recv(1024).strip()
                if request != '<policy-file-request/>\0':
                    logging.info('Unrecognized request from %s: %s' % (addrstr, request))
                    return
                logging.info('Valid request received from %s' % (addrstr,))
                fo = open('flashpolicy.xml', 'rb')
                str=fo.read()
                conn.sendall(str)
                logging.info('Sent policy file to %s' % (addrstr,))
        except socket.error, e:
            logging.info('Error handling connection from %s: %s' % (addrstr, e[1]))
        except Exception, e:
            logging.info('Error handling connection from %s: %s' % (addrstr, e[1]))

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)

哦,我想看看我知道的原稿100%正确是有帮助的:

^{pr2}$

Tags: fromimportselfinforequestloggingdefservice
1条回答
网友
1楼 · 发布于 2024-04-24 09:41:26

在完成了几次不同的尝试/版本之后,我尝试使用以下步骤将原始的python脚本作为服务安装:

http://www.tacktech.com/display.cfm?ttid=197

这样做之后,当我启动我的服务时,它会向我提供一条消息,说明它开始了,然后又停止了。我以为这个例子使用的是.exe的扩展名,.py扩展名可能无效,所以我下载了py2exe并将python脚本转换为可执行文件,但是这仍然没有解决问题。最后,我得出结论,这个特定的脚本不想作为服务安装,但我确实找到了一种方法,使它隐形运行,这是我的最终目标。在

为此(在Windows中),我创建了一个名为不可见.vbs具体如下:

CreateObject("Wscript.Shell").Run """" & WScript.Arguments(0) & """", 0, False

为了执行此文件,我创建了以下文件,并将其添加到我的启动文件夹中:

^{pr2}$

但是,如果有人需要做类似的事情,您只需在命令提示符中手动输入上述命令,假设您有wscript模块(基于Windows的脚本主机)。在

相关问题 更多 >