WEB服务器程序 发送消息 到某一应用程序

时间:2022-09-17 20:50:29
我要做一WEB服务器,但它还有控制另一应用程序。所以,我想通过发送Windows消息的方法,控制另一应用程序。
是否还有其他的更好的方法?

怎样去实现我的目的?

20 个解决方案

#1


控制另一 应用程序

如果你 修改该应用程序就好了 

发消息就很多方式

数据库了  webservice 了等等

#2


两个程序都是我来完成。

发送消息怎样去发,webservice , 数据库分别怎样去实现。

#3


你让应用程序来请求webservices,根据web services的返回值来控制应用程序

#4


"让应用程序来请求webservices,根据web   services的返回值来控制应用程序"
这方法应该可以,但要求应用程序不断地请求,这就有问题了。
就是说 他们之间时时刻刻都在 "请求与应答" 中。

有没有让应用程序等待授命的好方法。

#5


仅供参考:
1)把应用程序(A.EXE)的DDE功能打开用来接收命令行参数(,比如,将启动窗口设置linkmode=1,linktopic="aaa"....启动具体可GOOGLE一下);
2)WEB SERVER端使用WSCRIPT.SHELL:
 dim objShell
 set objShell=server.create("WSCRIPT.SHELL")
 objShell.shell "路径+A.EXE -参数"
3)在A.EXE的DDE窗口处理参数:
如果COMMAND不为空,判断APP.PREINSTANCE;如果TRUE,将参数传过去,关闭新窗口;如果FALSE,带命令启动A.EXE.....
-------------------
当然,这可能涉及到WEB服务器访问权限问题,如果匿名用户不可以,你可以先用WINDOWS集成验证身份调试;调试完毕后,将2)中的功能剥离出来写个DLL做为"中间件",让WEB调用就OK了

#6


更正:set   objShell=server.create( "WSCRIPT.SHELL ") 
应该是:set objShell=server.createobject( "WSCRIPT.SHELL ") 

#7


应用程序(A.EXE)基本上是一直打开的,跟 WEB SERVER端在一台机上。

假设应用程序(A.EXE)是一个播放软件,现在需要WEB SERVER端控制它的播放及播放内容。

toury 兄给了我一种提示。

WEB SERVER端 真的不能直接发消息到应用程序吗?像调用 API函数 SendMessage

如果做成一个DLL,让WEB调用,而DLL里应该可以发送消息的吧。




#8



我给你出个怪招哈。用ASP+应用程序来操作。

在一方的服务器上建立WEB服务器,用客户端调用服务器上的ASP文件,Post发送一些特殊格式的命令。由服务器上的ASP文件将命令存入数据库,

在服务器上写一个应用程序,这个程序随时读取这个数据库的内容,用时间顺序的排列,一条一条的读取进行执行。执行一条删除一条。这样就可以从80端口进去了。

也可以通过防火墙了。

当然,这些命令,应该有一些特殊的格式,让服务器的应用程序能识别。和一定的验证方法。也可以减少一些低级黑客的攻击。

#9


"WEB   SERVER端   真的不能直接发消息到应用程序吗?像调用   API函数   SendMessage ":
兄弟,ASP程序是有访问限制的呀,这个是关键;如果你不让匿名用户(IUSR_机器名)访问那好办了,就给访问者一个WINDOWS集成验证用户身份就OK了;但事实上ASP程序就是为了匿名用户和SERVER"互动"的嘛
------------------------------
我乱猜猜你的需求:你是想让用户点击一个音乐链接或网页播放列表,然后让A.EXE播放吗?
如果是这样的话我不太明白为什么用A.EXE而不用写个播放PLUGIN让客户端自己点击自己听呢?
如果希望客户端点击后你在SERVER让A.EXE播放给你听,那就用AJAX把客户点击的音乐地址POST给SERVER;接到播放文件地址参数后:shell   "A.EXE   -参数 "

顺便提一句,如果匿名用户有随便调用SERVER机器API权限的话,那这个SERVER所面临的巨大风险可想而知了,呵呵

#10


ykisely 兄的怪招不错,值得考虑。

toury   兄分析得非常详细,让我获益不少。
说对了,我就是想让客户选择文件,播放给我听。呵呵,好像有点荒谬,但这是事实。
  shell       "A.EXE“       -参数 
那会不会造成 A.exe 频繁地启动。

WEB Server 跟 A.exe 是不是也可以通过 TCP/IP来通信。
就是说:A.exe 打开了侦听端口(9988), 客户要改变播放的内容时,就可通过 WEB SERver 给本机指定的端口(9988)
发送内容。当然,发送的内容是根据一定的协议的。
这方法可行吗?

怎样实现?

#11


果然是这样,呵呵
不用那么麻烦,侦听什么呀,DDE就OK了
A.EXE 基本架构清单:
frmDDE:--负责接收DDE消息
frmMain:--播放主窗口
------------------------
A.EXE总是开着的呀,怎么会"造成A.exe频繁地启动"?

#12


谢谢 toury 兄, 现在我要先学习一下(DDE),做一下试验。

#13


在.NET中使用命名管道完成进程间通信

我是使用ASP.NET来开发的。

这个方法可行吗?

#14


用.net那另当别论了哦,那就A.EXE一起用VB.NET吧
--------------------------------------------;
因为你发在这个板块,所以我有上面的回答,呵呵
其实你这个需求用ASP和VB可以很简单完成.给你个具体思路建议:

<!--mList.asp(播放文件列表页)-->
<script language=vbscript>
function sendlist(s)
dim XmlHttp,ret
  set XmlHttp = CreateObject("Microsoft.XMLHTTP")
  XmlHttp.Open "post", "add.asp?fn="&s, false 
  XmlHttp.setRequestHeader "Content-Type","text/XML" 
  XmlHttp.Send
  ret = XmlHttp.responsetext
  if ret="OK" then
    msgbox "音乐链接已成功发送!",64,"提示"
  else
    msgbox "音乐链接发送失败!",48,"提示"
  end if
  XmlHttp =nothing
end function
</script>
<body>
<table>
<tr><td id='L1' onclick='javascript:void sendlist('服务器上aaa.wma的完整路径或INTERNET的URL');'>aaa.wma</td><tr>
<tr><td id='L2' onclick='javascript:void sendlist('服务器上bbb.mp3的完整路径或INTERNET的URL');'>bbb.mp3</td><tr>
<tr><td id='L3' onclick='javascript:void sendlist('服务器上ccc.wmv的完整路径或INTERNET的URL');'>ccc.wmv</td><tr>
</table>
</body>
-------------------------
<!--svrDeal.asp(服务器处理页)-->
<%
  fn=request.querystring("fn")'传过来的音乐文件路径
  if len(fn)>0 then
    set obj=server.createobject("wscript.shell")
    obj.shell "A.exe /" & fn
    response.write "OK"
    response.end
  end if
%>

/////////////////////////////////////////////////////////////

'A.exe
'1)frmStart
'设置属性:
   Caption         =   "DDE"
   LinkMode        =   1  'Source
   LinkTopic       =   "FormDDE"
   ShowInTaskbar   =   0   'False
   Visible         =   0   'False
'加一个PictureBox作为DDE容器(name: picDDE )

Option Explicit

Private Sub Form_Load()
  sDirMsg = Command'这个Command就是命令行参数
  If Len(sDirMsg) > 0 Then
    sFilePostfix = Right$(sDirMsg, Len(sDirMsg) - InStrRev(sDirMsg, "."))
    sFilePostfix = left$(sFilePostfix, Len(sFilePostfix) - 1)
    If DetermindType(sFilePostfix) then
      '如果支持
       If App.PrevInstance Then ' 程序已经运行
         Me.LinkTopic = ""' 清除新程序的DDE服务器属性,避免在连接DDE程序时出问题
        Me.LinkMode = 0   
        LinkAndSendMessage sDirMsg' 有命令行参数就传递过去
        End'参数传递完毕后退出新实例
      Else                   ' 程序未运行
        sDirMsg = Mid$(sDirMsg, 2, Len(sDirMsg) - 2)'去掉命令行参数的引号
        Call Main()
      End If
    Else
      MsgBox "本播放器不支持[" & sFilePostfix & "]格式的文件":   End
    End If
   else
    if app.Preinstance then end else call main()'如果程序运行中则退出新实例,否则启动
  end if
End Sub

Private Sub LinkAndSendMessage(ByVal Msg As String)
  Dim t&  
  picDDE.LinkMode = 0                         
  picDDE.LinkTopic = App.EXEName & "|FormDDE"'连接DDE程序,发送参数
  picDDE.LinkMode = 2                         
  picDDE.LinkExecute Msg 
  
  t = picDDE.LinkTimeout
  picDDE.LinkTimeout = 1                     '终止DDE通道
  picDDE.LinkMode = 0                        ' 超时强制终止
  picDDE.LinkTimeout = t 
End Sub

Private Sub Form_LinkExecute(ByRef CmdStr As String, Cancel As Integer)
  '进入frmMain处理播放
  '.........
  Cancel = False
End Sub

private function DetermindType(s) as boolean
'根据你的播放器,检查是否支持该格式...
'...
end function

'*****************************************
'module1:
public sDir$'定义播放文件路径全局变量

sub main()
  frmMain.show
end sub

#15


public sDirMsg$'定义播放文件路径全局变量

#16


非常感谢toury兄,你的例子很详细,很实用。
虽然我只是一位看过几天关于ASP.net的书的初学者,但我看懂你的代码了。
我是C系列的,Pascal语言,C++语言, 所以我打算使用C#作为开发语言。

我对VB不是很熟悉,只是几个月前要为我所写的DLL做一个VB调用DLL的范例而对它进行一些学习。
呵呵,殊途同归啊。当然,各有优缺点,有时非得兜了个圈才能达到其他语言很方便就能做到的功能。

对于你举的例子,我把它改成C#语言了。

不过,我对在.NET中使用命名管道完成进程间通信这一方面颇感兴趣。

以下为引用:
NET框架提供了几种好的选择来完成进程间通信(IPC):Web Service,Remoting。最快的是Remoting,因为它使用TCP通道和二进制格式。 

通常来说,Remoting是很不错的,但如果仅限于本地机器的两个进程间相互通信,其处理机制增加了不必要的开销。所以要考虑一些别的选择,比较好的是命名管道(Named Pipes),不会进行二进制序列化,所以提供了更快的IPC。

这个解决方案最有效的使用是在一个应用程序需要和另一个应用程序进行非常频繁的、短文本的消息通信的情况下,并且是在同一台机器或在同一局域网内部。对于结构化的数据交换,这些文本消息也可以是XML文档或序列化的.NET对象。通信时没有安全层,因为命名管道最多只能在局域网中运行,所以假定安全问题由别的层进行处理。

#17


C#写这个功能确实更方便,用web service是个好的选择;呵呵

#18


路过

#19


怎么用Remoting 实现两个程序之间的通信啊,能不能给个例子,谢谢

#20


用webservice也可以啊,求求哪位大哥给个例子啊

#1


控制另一 应用程序

如果你 修改该应用程序就好了 

发消息就很多方式

数据库了  webservice 了等等

#2


两个程序都是我来完成。

发送消息怎样去发,webservice , 数据库分别怎样去实现。

#3


你让应用程序来请求webservices,根据web services的返回值来控制应用程序

#4


"让应用程序来请求webservices,根据web   services的返回值来控制应用程序"
这方法应该可以,但要求应用程序不断地请求,这就有问题了。
就是说 他们之间时时刻刻都在 "请求与应答" 中。

有没有让应用程序等待授命的好方法。

#5


仅供参考:
1)把应用程序(A.EXE)的DDE功能打开用来接收命令行参数(,比如,将启动窗口设置linkmode=1,linktopic="aaa"....启动具体可GOOGLE一下);
2)WEB SERVER端使用WSCRIPT.SHELL:
 dim objShell
 set objShell=server.create("WSCRIPT.SHELL")
 objShell.shell "路径+A.EXE -参数"
3)在A.EXE的DDE窗口处理参数:
如果COMMAND不为空,判断APP.PREINSTANCE;如果TRUE,将参数传过去,关闭新窗口;如果FALSE,带命令启动A.EXE.....
-------------------
当然,这可能涉及到WEB服务器访问权限问题,如果匿名用户不可以,你可以先用WINDOWS集成验证身份调试;调试完毕后,将2)中的功能剥离出来写个DLL做为"中间件",让WEB调用就OK了

#6


更正:set   objShell=server.create( "WSCRIPT.SHELL ") 
应该是:set objShell=server.createobject( "WSCRIPT.SHELL ") 

#7


应用程序(A.EXE)基本上是一直打开的,跟 WEB SERVER端在一台机上。

假设应用程序(A.EXE)是一个播放软件,现在需要WEB SERVER端控制它的播放及播放内容。

toury 兄给了我一种提示。

WEB SERVER端 真的不能直接发消息到应用程序吗?像调用 API函数 SendMessage

如果做成一个DLL,让WEB调用,而DLL里应该可以发送消息的吧。




#8



我给你出个怪招哈。用ASP+应用程序来操作。

在一方的服务器上建立WEB服务器,用客户端调用服务器上的ASP文件,Post发送一些特殊格式的命令。由服务器上的ASP文件将命令存入数据库,

在服务器上写一个应用程序,这个程序随时读取这个数据库的内容,用时间顺序的排列,一条一条的读取进行执行。执行一条删除一条。这样就可以从80端口进去了。

也可以通过防火墙了。

当然,这些命令,应该有一些特殊的格式,让服务器的应用程序能识别。和一定的验证方法。也可以减少一些低级黑客的攻击。

#9


"WEB   SERVER端   真的不能直接发消息到应用程序吗?像调用   API函数   SendMessage ":
兄弟,ASP程序是有访问限制的呀,这个是关键;如果你不让匿名用户(IUSR_机器名)访问那好办了,就给访问者一个WINDOWS集成验证用户身份就OK了;但事实上ASP程序就是为了匿名用户和SERVER"互动"的嘛
------------------------------
我乱猜猜你的需求:你是想让用户点击一个音乐链接或网页播放列表,然后让A.EXE播放吗?
如果是这样的话我不太明白为什么用A.EXE而不用写个播放PLUGIN让客户端自己点击自己听呢?
如果希望客户端点击后你在SERVER让A.EXE播放给你听,那就用AJAX把客户点击的音乐地址POST给SERVER;接到播放文件地址参数后:shell   "A.EXE   -参数 "

顺便提一句,如果匿名用户有随便调用SERVER机器API权限的话,那这个SERVER所面临的巨大风险可想而知了,呵呵

#10


ykisely 兄的怪招不错,值得考虑。

toury   兄分析得非常详细,让我获益不少。
说对了,我就是想让客户选择文件,播放给我听。呵呵,好像有点荒谬,但这是事实。
  shell       "A.EXE“       -参数 
那会不会造成 A.exe 频繁地启动。

WEB Server 跟 A.exe 是不是也可以通过 TCP/IP来通信。
就是说:A.exe 打开了侦听端口(9988), 客户要改变播放的内容时,就可通过 WEB SERver 给本机指定的端口(9988)
发送内容。当然,发送的内容是根据一定的协议的。
这方法可行吗?

怎样实现?

#11


果然是这样,呵呵
不用那么麻烦,侦听什么呀,DDE就OK了
A.EXE 基本架构清单:
frmDDE:--负责接收DDE消息
frmMain:--播放主窗口
------------------------
A.EXE总是开着的呀,怎么会"造成A.exe频繁地启动"?

#12


谢谢 toury 兄, 现在我要先学习一下(DDE),做一下试验。

#13


在.NET中使用命名管道完成进程间通信

我是使用ASP.NET来开发的。

这个方法可行吗?

#14


用.net那另当别论了哦,那就A.EXE一起用VB.NET吧
--------------------------------------------;
因为你发在这个板块,所以我有上面的回答,呵呵
其实你这个需求用ASP和VB可以很简单完成.给你个具体思路建议:

<!--mList.asp(播放文件列表页)-->
<script language=vbscript>
function sendlist(s)
dim XmlHttp,ret
  set XmlHttp = CreateObject("Microsoft.XMLHTTP")
  XmlHttp.Open "post", "add.asp?fn="&s, false 
  XmlHttp.setRequestHeader "Content-Type","text/XML" 
  XmlHttp.Send
  ret = XmlHttp.responsetext
  if ret="OK" then
    msgbox "音乐链接已成功发送!",64,"提示"
  else
    msgbox "音乐链接发送失败!",48,"提示"
  end if
  XmlHttp =nothing
end function
</script>
<body>
<table>
<tr><td id='L1' onclick='javascript:void sendlist('服务器上aaa.wma的完整路径或INTERNET的URL');'>aaa.wma</td><tr>
<tr><td id='L2' onclick='javascript:void sendlist('服务器上bbb.mp3的完整路径或INTERNET的URL');'>bbb.mp3</td><tr>
<tr><td id='L3' onclick='javascript:void sendlist('服务器上ccc.wmv的完整路径或INTERNET的URL');'>ccc.wmv</td><tr>
</table>
</body>
-------------------------
<!--svrDeal.asp(服务器处理页)-->
<%
  fn=request.querystring("fn")'传过来的音乐文件路径
  if len(fn)>0 then
    set obj=server.createobject("wscript.shell")
    obj.shell "A.exe /" & fn
    response.write "OK"
    response.end
  end if
%>

/////////////////////////////////////////////////////////////

'A.exe
'1)frmStart
'设置属性:
   Caption         =   "DDE"
   LinkMode        =   1  'Source
   LinkTopic       =   "FormDDE"
   ShowInTaskbar   =   0   'False
   Visible         =   0   'False
'加一个PictureBox作为DDE容器(name: picDDE )

Option Explicit

Private Sub Form_Load()
  sDirMsg = Command'这个Command就是命令行参数
  If Len(sDirMsg) > 0 Then
    sFilePostfix = Right$(sDirMsg, Len(sDirMsg) - InStrRev(sDirMsg, "."))
    sFilePostfix = left$(sFilePostfix, Len(sFilePostfix) - 1)
    If DetermindType(sFilePostfix) then
      '如果支持
       If App.PrevInstance Then ' 程序已经运行
         Me.LinkTopic = ""' 清除新程序的DDE服务器属性,避免在连接DDE程序时出问题
        Me.LinkMode = 0   
        LinkAndSendMessage sDirMsg' 有命令行参数就传递过去
        End'参数传递完毕后退出新实例
      Else                   ' 程序未运行
        sDirMsg = Mid$(sDirMsg, 2, Len(sDirMsg) - 2)'去掉命令行参数的引号
        Call Main()
      End If
    Else
      MsgBox "本播放器不支持[" & sFilePostfix & "]格式的文件":   End
    End If
   else
    if app.Preinstance then end else call main()'如果程序运行中则退出新实例,否则启动
  end if
End Sub

Private Sub LinkAndSendMessage(ByVal Msg As String)
  Dim t&  
  picDDE.LinkMode = 0                         
  picDDE.LinkTopic = App.EXEName & "|FormDDE"'连接DDE程序,发送参数
  picDDE.LinkMode = 2                         
  picDDE.LinkExecute Msg 
  
  t = picDDE.LinkTimeout
  picDDE.LinkTimeout = 1                     '终止DDE通道
  picDDE.LinkMode = 0                        ' 超时强制终止
  picDDE.LinkTimeout = t 
End Sub

Private Sub Form_LinkExecute(ByRef CmdStr As String, Cancel As Integer)
  '进入frmMain处理播放
  '.........
  Cancel = False
End Sub

private function DetermindType(s) as boolean
'根据你的播放器,检查是否支持该格式...
'...
end function

'*****************************************
'module1:
public sDir$'定义播放文件路径全局变量

sub main()
  frmMain.show
end sub

#15


public sDirMsg$'定义播放文件路径全局变量

#16


非常感谢toury兄,你的例子很详细,很实用。
虽然我只是一位看过几天关于ASP.net的书的初学者,但我看懂你的代码了。
我是C系列的,Pascal语言,C++语言, 所以我打算使用C#作为开发语言。

我对VB不是很熟悉,只是几个月前要为我所写的DLL做一个VB调用DLL的范例而对它进行一些学习。
呵呵,殊途同归啊。当然,各有优缺点,有时非得兜了个圈才能达到其他语言很方便就能做到的功能。

对于你举的例子,我把它改成C#语言了。

不过,我对在.NET中使用命名管道完成进程间通信这一方面颇感兴趣。

以下为引用:
NET框架提供了几种好的选择来完成进程间通信(IPC):Web Service,Remoting。最快的是Remoting,因为它使用TCP通道和二进制格式。 

通常来说,Remoting是很不错的,但如果仅限于本地机器的两个进程间相互通信,其处理机制增加了不必要的开销。所以要考虑一些别的选择,比较好的是命名管道(Named Pipes),不会进行二进制序列化,所以提供了更快的IPC。

这个解决方案最有效的使用是在一个应用程序需要和另一个应用程序进行非常频繁的、短文本的消息通信的情况下,并且是在同一台机器或在同一局域网内部。对于结构化的数据交换,这些文本消息也可以是XML文档或序列化的.NET对象。通信时没有安全层,因为命名管道最多只能在局域网中运行,所以假定安全问题由别的层进行处理。

#17


C#写这个功能确实更方便,用web service是个好的选择;呵呵

#18


路过

#19


怎么用Remoting 实现两个程序之间的通信啊,能不能给个例子,谢谢

#20


用webservice也可以啊,求求哪位大哥给个例子啊

#21