1. 程式人生 > >基於C#的簡單http伺服器,用於多臺工控機資料的監控

基於C#的簡單http伺服器,用於多臺工控機資料的監控

      最近工作在公司有這麼一個需求:在公司車間有多臺電腦執行著視覺檢測程式,我們在辦公室的時候需要清楚車間程式的執行狀態(比如NG率等等)。

需求分析:多臺電腦的資料上傳到一臺電腦,那麼需要一臺伺服器,上傳的資料可以被多個人看到,最好是以網頁的形式,誰都可以訪問。這個貌似涉及到伺服器(後臺)、網站(前端),雖然自己平時的工作也算是大雜燴,但是涉及面比較廣,還是挺有難度的。

最後得出的方案:在辦公室使用一臺電腦作為伺服器,車間電腦使用http協議上傳資料到伺服器。然後再寫一個簡單的網頁,訪問伺服器,返回JSON資料,顯示出來。這個網站架設在伺服器電腦上,使用Windows自帶的IIS。

(一)、IIS設定

                   進入【控制面板】-【程式】,選中《開啟或關閉Windows功能》


開啟之後,選中其中兩項(紅色方框)




點選確定之後,等待幾分鐘,在C盤目錄下生成inetpub資料夾,點選進去,有5個資料夾



等下寫好的html檔案就放在 wwwroot資料夾下,這時候可以在瀏覽器中輸入自己的IP(或者localhost)來訪問,,比如直接輸入109.17.86.100回車即可出現網頁

注意:第一步我們把網站架設好了,網站內容待會解釋哈。

(二)伺服器

http伺服器可以使用Java編寫,但是Windows下.NET平臺編寫很方便

        http伺服器作用:儲存上傳的資料,提供網站訪問(我監聽了2個埠)

       直接貼程式碼:

<span style="font-size:14px;">using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace Vision_Server
{
    public partial class Form1 : Form
    {
        String[] NGString=new String[39];
        String[] FailString = new String[39];
        String[] TimeString = new String[39];

        Thread uploadThread;
        Thread downloadThread;
        
        public Form1()
        {
            InitializeComponent();
        }


        private void Form1_Load(object sender, EventArgs e)
        {

            for (int i = 0; i < 39; i++)
            {
                NGString[i] = "*";
                FailString[i] = "*";
                TimeString[i] = "*";
            }

            for (int i = 1; i < 40; i++)
            {
                dataGridView_AAM.Rows.Add(i.ToString() + "#", "*", "*", "*", "*");

            }
            //上傳資料服務
            uploadThread = new Thread(new ThreadStart(uploadPro));
            uploadThread.Start();

            //下載資料服務
            downloadThread = new Thread(new ThreadStart(downloadPro));
            downloadThread.Start();
        }

        private void uploadPro()
        {

            using (HttpListener listerner = new HttpListener())
            {
                listerner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;//指定身份驗證 Anonymous匿名訪問
                listerner.Prefixes.Add("http://109.17.86.92:8080/server/");
                listerner.Start();
                while (true)
                {
                    //等待請求連線
                    //沒有請求則GetContext處於阻塞狀態
                    HttpListenerContext ctx = listerner.GetContext();
                    ctx.Response.StatusCode = 200;//設定返回給客服端http狀態程式碼
                    try
                    {
                        string pro = ctx.Request.QueryString["pro"];
                        string line = ctx.Request.QueryString["line"];
                        string NG = ctx.Request.QueryString["NG"];
                        string fail = ctx.Request.QueryString["fail"];
                        printLog(" pro=" + pro + " line=" + line + " NG=" + NG + " Fail=" + fail);
                        if (pro == "AAM")
                        {
                            int lineIndex = int.Parse(line) - 1;

                            dataGridView_AAM.Rows[lineIndex].Cells[1].Value = NG;
                            dataGridView_AAM.Rows[lineIndex].Cells[2].Value = fail;
                            dataGridView_AAM.Rows[lineIndex].Cells[3].Value = DateTime.Now.ToString();

                            NGString[lineIndex] = NG;
                            FailString[lineIndex] = fail;
                            TimeString[lineIndex] = DateTime.Now.ToString();

                        }

                        //使用Writer輸出http響應程式碼

                        using (StreamWriter writer = new StreamWriter(ctx.Response.OutputStream))
                        {

                            writer.WriteLine("OK");
                            //writer.Close();
                            // ctx.Response.Close();
                        }
                    }
                    catch (Exception ex)
                    {
                        printLog(ex.Message);
                    }

                }
                listerner.Stop();
            }
      
        }

        private void downloadPro()
        {

            using (HttpListener listerner = new HttpListener())
            {
                listerner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;//指定身份驗證 Anonymous匿名訪問
                listerner.Prefixes.Add("http://109.17.86.92:8888/web/");
                listerner.Start();
                while (true)
                {
                    //等待請求連線
                    //沒有請求則GetContext處於阻塞狀態
                    HttpListenerContext ctx = listerner.GetContext();
                    ctx.Response.StatusCode = 200;//設定返回給客服端http狀態程式碼
                    try
                    {
                        int locationY = int.Parse(ctx.Request.QueryString["locationY"]);

                        //使用Writer輸出http響應程式碼
                        using (StreamWriter writer = new StreamWriter(ctx.Response.OutputStream))
                        {

                            String retString = "";
                            //返回AAM資料json
                            retString += "{";
                            retString += addMarks("AAM") + ":";
                            retString += "[";
                            for (int i = 1; i < 40; i++)
                            {
                                retString += "{";
                                retString += addMarks("line") + ":" + addMarks(i.ToString()) + ",";
                                retString += addMarks("pro") + ":" + addMarks("AAM") + ",";
                                retString += addMarks("NG") + ":" + addMarks(NGString[i - 1]) + ",";
                                retString += addMarks("fail") + ":" + addMarks(FailString[i - 1]) + ",";
                                retString += addMarks("time") + ":" + addMarks(TimeString[i - 1]);
                                retString += "}";
                                if (i != 39)
                                    retString += ",";
                            }
                            retString += "]";
                            retString += ",";
                            retString += addMarks("locationY") + ":" + addMarks(locationY.ToString());
                            retString += "}";
                            writer.WriteLine(retString);
                            writer.Close();
                            ctx.Response.Close();

                        }

                    }
                    catch(Exception ex)
                    {
                        printLog(ex.Message);
                    }
                }
                listerner.Stop();
            }

            

         }

        private String addMarks(String s)
        {
            return "\"" + s + "\"";
        }

        private void printLog(String str)
        {
            CheckForIllegalCrossThreadCalls = false;
            if (textBox_log.Lines.Length  > 30)
            {
                textBox_log.Text = "";
            }
            String time = DateTime.Now.ToShortTimeString();
            textBox_log.Text += time+">" + str + "\r\n";

        }

        private void button_exit_Click(object sender, EventArgs e)
        {

            uploadThread.Abort();
            downloadThread.Abort();
            Application.Exit();
        }
  
    }
}</span><span style="font-weight: bold; font-size: 24px;">
</span>
介面效果


(三)、web站點

上面的伺服器介面只有一臺電腦可以顯示,為了可以一網頁的形式共享,編寫一個網頁

網頁定時重新整理,拉去資料到表格中顯示

上程式碼:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>Vision監控</title>

<style type="text/css">

.go_no {

	background-color: #FF3;

}

#apDiv1 {
	position:absolute;
	width:200px;
	height:115px;
	z-index:1;
	left: 526px;
	top: 91px;
}

.mytitle {
	color: #0F0;
}
#AAMTable {
	color: #00F;
}
</style></head>

<center>
<body>
<p><strong class="mytitle">AAM 複合化程式監控(自動重新整理)</strong></p>
<table   id="AAMTable" border="1">
  <tr>
    <th width="50" align="center" scope="col">line</th>
    <th width="100" align="center" scope="col">GO-NO</th>
    <th width="50" align="center" scope="col">Fail</th>
    <th width="150" align="center" scope="col">time</th>
  </tr>
  <tr>
    <td align="center">1#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">2#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">3#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">4#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">5#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">6#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">7#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">8#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">9#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">10#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">11#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">12#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">13#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">14#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">15#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">16#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">17#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">18#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">19#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">20#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">21#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">22#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">23#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">24#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">25#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">26#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">27#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">28#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">29#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">30#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">31#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">32#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">33#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">34#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">35#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">36#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">37#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">38#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
  <tr>
    <td align="center">39#</td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
    <td align="center" id="AAMTable"> </td>
  </tr>
</table>
<p> </p>

</body>
</center>
</html>


<script type=text/javascript> 
var locationY=50;
function timedGetText(){
	locationY=document.getElementById("AAMTable").offsetTop;
	var url="http://109.17.86.92:8888/web/?locationY=" + locationY;  //伺服器地址
	var time=400;
    var request = new XMLHttpRequest();
    var timeout = false;
	//訪問限時,限時長為200ms
    var timer = setTimeout( function(){
        timeout = true;
        request.abort();
    }, time );
    request.open( "GET", url );
    request.onreadystatechange = function(){
        if( request.readyState !== 4 ) return;
        if( timeout ) return;
        clearTimeout( timer );
        if( request.status === 200 ){
				//資料返回成功
            	 var obj =JSON.parse(request.responseText );  //將JSON字串轉換成JSON物件
				 
	             for(var i=0;i<39;i++)
	             {
		            var fail=obj.AAM[i].fail;
	 	            var NG=obj.AAM[i].NG;
					var time=obj.AAM[i].time;
					
					//表格操作
					document.getElementById("AAMTable").rows[i+1].cells[1].innerHTML=NG;
					document.getElementById("AAMTable").rows[i+1].cells[2].innerHTML=fail;
					document.getElementById("AAMTable").rows[i+1].cells[3].innerHTML=time;
	 			}
				var retlocationY=obj.locationY;
				window.scrollBy(0,retlocationY);
        }
    }
    request.send( null );
}

timedGetText();
function myrefresh()
{   //重新整理頁面
	window.location.reload();
}
setInterval('myrefresh()',2000);   //定時重新整理頁面,2s一次

</script>
	 
		  

網頁效果: