2015-06-21 42 views
0

假設我在Windows服務上運行以下代碼。 我必須將數據從機器上的Windows服務發送到在同一臺機器上打開的網頁(,但未在該機器上託管)。從Windows服務發送UDP數據到瀏覽器在同一臺機器上運行網頁

 static void Main(string[] args) 
     { 
      Int32 counter = 0; 
      while (counter < 100) 
      { 
       SendUDP("127.0.0.1", 49320, counter.ToString(), counter.ToString().Length); 
       Thread.Sleep(2000); 
       counter++; 
      } 
     } 

     public static void SendUDP(string hostNameOrAddress, int destinationPort, string data, int count) 
     { 
      IPAddress destination = Dns.GetHostAddresses(hostNameOrAddress)[0]; 
      IPEndPoint endPoint = new IPEndPoint(destination, destinationPort); 
      byte[] buffer = Encoding.ASCII.GetBytes(data); 
      Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
      for (int i = 0; i < count; i++) 
      { 
       socket.SendTo(buffer, endPoint); 
      } 
      socket.Close(); 
      System.Console.WriteLine("Sent: " + data); 
     } 

我必須監聽發送到端口49320的數據,然後在瀏覽器中處理它。

我可以在網頁上用Node.js創建一個監聽器,但是我必須單獨啓動這個服務,並在客戶端安裝node.js。

除此之外還有其他的選擇嗎?更輕巧的東西?

我也可以創建一個AJAX來每2秒鐘查詢一次web服務,它可以做與Windows服務一樣的事情,但是好像很多查詢一直沒有發送。

//websocket gateway on 8070 
var app = require('http').createServer(handler) 
    , io = require('socket.io').listen(app) 
    , fs = require('fs'); 
var mysocket = 0; 
app.listen(8070); 
function handler (req, res) { 
    fs.readFile(__dirname + '/index.html', 
    function (err, data) { 
    if (err) { 
     res.writeHead(500); 
     return res.end('Error loading index.html'); 
    } 
    res.writeHead(200); 
    res.end(data); 
    }); 
} 
io.sockets.on('connection', function (socket) { 
    console.log('index.html connected'); 
    mysocket = socket; 
}); 

//udp server on 49320 
var dgram = require("dgram"); 
var server = dgram.createSocket("udp4"); 
server.on("message", function (msg, rinfo) { 
    console.log("msg: " + msg); 
    if (mysocket != 0) { 
    mysocket.emit('field', "" + msg); 
    mysocket.broadcast.emit('field', "" + msg); 
    } 
}); 
server.on("listening", function() { 
    var address = server.address(); 
    console.log("udp server listening " + address.address + ":" + address.port); 
}); 
server.bind(49320); 
+0

你有沒有考慮過在windows服務中使用SignalR? –

回答

1

使用信號R.這是一個技術,自動協商推從一個服務器的事件發送到瀏覽器(例如永遠的框架,網絡套接字)的最高效的運輸 - 這將回落到你提到的輪詢方法在你的問題,如果需要。我認爲這是使用原始UDP更好的方法,因爲所有低級別的工作都是爲你完成的。

下面是從一個窗口服務使用信號R的例子: https://code.msdn.microsoft.com/windowsapps/SignalR-self-hosted-in-6ff7e6c3

從該樣品 - 這裏的使用OWIN自主機SignalR的甚至更簡單的例子(不IIS):

using System; 
using Microsoft.AspNet.SignalR; 
using Microsoft.Owin.Cors; 
using Microsoft.Owin.Hosting; 
using Owin; 

namespace SignalRWindowsService 
{ 
    static class Program 
    { 
     static void Main() 
     { 
      string url = "http://localhost:8080"; 
      WebApp.Start(url); 

      Console.WriteLine("Press any key to exit"); 
      Console.ReadKey();    
     } 
    } 

    class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      //This means you can access the web sockets from the local service (on a different URL) than the domain the page in the browser was served up from. 
      app.UseCors(CorsOptions.AllowAll); 
      app.MapSignalR(); 
     } 
    } 

    public class MyHub : Hub 
    { 
     public void Send(string name, string message) 
     { 
      Clients.All.addMessage(name, message); 
     } 
    } 
} 

您需要以下的NuGet包:

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="Microsoft.AspNet.Cors" version="5.0.0" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.SignalR.Core" version="2.0.3" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.SignalR.SelfHost" version="2.0.3" targetFramework="net45" /> 
    <package id="Microsoft.Owin" version="2.1.0" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Cors" version="2.1.0" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Diagnostics" version="2.0.1" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Host.HttpListener" version="2.0.1" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Hosting" version="2.0.1" targetFramework="net45" /> 
    <package id="Microsoft.Owin.Security" version="2.0.1" targetFramework="net45" /> 
    <package id="Microsoft.Owin.SelfHost" version="2.0.1" targetFramework="net45" /> 
    <package id="Newtonsoft.Json" version="5.0.1" targetFramework="net45" /> 
    <package id="Owin" version="1.0" targetFramework="net45" /> 
</packages> 
+0

你好,我嘗試過使用Signal R,但是我無法在我的本地計算機上啓動它。 之後,我嘗試使用MS SQL服務代理與Microsoft Web套接字相結合,在此處找到一個教程: http://dejanstojanovic.net/aspnet/2014/june/database-change-notifications-in- aspnet-using-websocket/ 你對WebSockets的IIS和Windows版本的最低要求有什麼想法嗎? –

+1

如果您使用IIS for Web Sockets,則至少需要IIS 8.0 - 它不受IIS 7或7.5的支持(http://www.iis.net/learn/get-started/whats-new-in -iis-8/IIS-80-網頁套接字協議支持)。但我只是嘗試了我在我的答案中提到的示例,它在我的機器上運行良好,我強烈建議您這樣做 - 示例不使用IIS - 它使用OWIN。我將示例中的服務器簡化爲最低限度,然後使用此代碼更新我的答案。 –

+0

感謝您的意見,我注意到雖然WebSockets已經使用了SignalR。 我在控制檯中有這個: SEC7118:XMLHttpRequest for http:// localhost:55088/b7d452 ... f621a8ef6c1/arterySignalR/abort?transport = webSockets&connectionToken = AQAAANoAwE%2FCl%w%3D%3D&requestUrl = http%3A% 2F%2Fdragosd%2FBroker01%2F&browserName =因特網+資源管理器&的userAgent = Mozilla的%2F5.0 +(視窗NT + + 6.3%3B + WOW64%3B +三叉戟%2F7.0%3B + .NET4.0E%3B + .NET4.0C%3B + .NET + CLR + 3.5.30729%3B + .NET + CLR + 2.0.50727%3B + .NET + CLR + 3.0.30729%3B + InfoPath.3%3B + rv%3A11.0)+ like + Gecko required Cross Origin資源共享(CORS)。 File:Broker01 –

相關問題