用程序来烘托浪漫气氛,不要枯燥的编程

  这个小程序是有一次给女朋友做小浪漫惊喜烘托气氛的,程序本身没有什么技术含量,只是思路挺有意思,先把程序功能说下。

  1.程序分为三部分,一个web端部署在服务器或者其他你可以访问的地方、一个服务端通讯控制台、一个客户端通讯端;

  2.通过手机浏览器访问服务器上的web端,web端页面上只有一个按钮用来更新数据库中状态字段为1;

  3.服务端通讯控制台实时获取数据库中的状态字段信息,当状态为1时将状态返回给客户端;

  4.客户端接收到状态为1的返回信息时播放本地指定目录的一个音乐文件,并返回一个“ok”状态信息给服务端;

  5.服务端接收到客户端的“ok”信息后,将数据库表中的状态字段再更新回0,避免客户端反复请求到状态为1的返回信息,反复播放音乐。

  以上是程序的功能简介,下图是流程图:

  

  通过上图可以了解到整套程序的运行流程机制,下面贴出各部分的代码:

  数据库只有一个表,表内只有一个状态字段,创建语句如下:

  

CREATE TABLE [dbo].[T_Status](
    
[Status] [int] default 0 not NULL
)

 

 

  web端只有一个页面,页面上有一个按钮,按钮事件执行更新库表中字段为1,代码就不贴了。

  服务器控制台通讯端使用TCP监听520端口,接收数据部分的代码如下:

  

服务端接收事件
 1         private static void OnReceiveData(object sender, NetEventArgs e)
 2         {
 3             string ClientMsg = e.Client.Datagram;
 4             string ConStr = ConfigurationManager.AppSettings["ConStr"].ToString();
 5             switch (ClientMsg)
 6             { 
 7                 case "get":
 8                     //Console.WriteLine(DateTime.Now.ToString("MM-dd HH:mm") + ":收到请求");
 9                     string SqlScalar = "select top 1 [Status] from [T_Status]";
10                     try
11                     {
12                         using (SqlConnection Conn = new SqlConnection(ConStr))
13                         {
14                             using (SqlCommand Cmd = new SqlCommand(SqlScalar, Conn))
15                             {
16                                 Conn.Open();
17                                 string result = Cmd.ExecuteScalar().ToString();
18                                 Cmd.Dispose();
19                                 Conn.Close();
20                                 Conn.Dispose();
21                                 Svr.Send(e.Client, result);
22                                 if (result == "1")
23                                 {
24                                     Console.WriteLine(DateTime.Now.ToString("MM-dd HH:mm:ss"+ ":收到客户端修改请求,成功修改返回状态给客户端");
25                                 }
26                             }
27                         }
28                     }
29                     catch (Exception ex)
30                     {
31                         Console.WriteLine(DateTime.Now.ToString("MM-dd HH:mm:ss"+ ":出现异常——  " + ex.Message);
32                     }
33                     break;
34                 case "ok":
35                     string SqlUpdate = "update [T_Status] set [Status]=0";
36                     try
37                     {
38                         using (SqlConnection Conn = new SqlConnection(ConStr))
39                         {
40                             using (SqlCommand Cmd = new SqlCommand(SqlUpdate, Conn))
41                             {
42                                 Conn.Open();
43                                 Cmd.ExecuteNonQuery();
44                                 Cmd.Dispose();
45                                 Conn.Close();
46                                 Conn.Dispose();
47                                 Console.WriteLine(DateTime.Now.ToString("MM-dd HH:mm:ss"+ ":收到客户端重置状态请求,已更新");
48                             }
49                         }
50                     }
51                     catch (Exception ex)
52                     {
53                         Console.WriteLine(DateTime.Now.ToString("MM-dd HH:mm:ss"+ ":出现异常——  " + ex.Message);
54                     }
55                     break;
56             }
57         }

 

 

  客户端主要的几个事件代码如下:

  

客户端主要事件
       /// <summary>
       
/// 连接事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void OnClientConnected(object sender, NetEventArgs e)
        {
            
base.Invoke(new MethodInvoker(delegate
            {
                
this.Text = "已连接服务器";
                btn_Start.Enabled 
= false;
            }));
        }
        
        
/// <summary>
        
/// 接收数据事件
         
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void OnReceiveData(object sender, NetEventArgs e)
        {
            
string Datagram = e.Client.Datagram;
            
if (Datagram == "1")
            {
                Cli.Send(
"ok");
                
string MusicPath = ConfigurationManager.AppSettings["MusicPath"].ToString();
                
base.Invoke(new MethodInvoker(delegate
                {
                    Player MyPlayer 
= new Player();
                    MyPlayer.FileName 
= MusicPath;
                    MyPlayer.play();
                }));
            }
        }

        
/// <summary>
        
/// 断开连接事件
         
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void OnClientExit(object sender, NetEventArgs e)
        {
            
base.Invoke(new MethodInvoker(delegate
            {
                
this.Text = "已断开连接";
                btn_Start.Enabled 
= true;
            }));
        }

        
/// <summary>
        
/// 启动按钮事件
         
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void btn_Start_Click(object sender, EventArgs e)
        {
            
string IP = ConfigurationManager.AppSettings["ServerIP"].ToString();
            Cli.Connect(IP, 
520);
            Thread.Sleep(
5000);
            
if (HeartThread == null)
            {
                HeartThread 
= new Thread(new ThreadStart(HearThread_Delegate));
                HeartThread.IsBackground 
= true;
                HeartThread.Priority 
= ThreadPriority.Highest;
                HeartThread.Name 
= "HeartThread";
                HeartThread.Start();
            }
        }

        
/// <summary>
        
/// 请求服务端事件
         
/// </summary>
        private void HearThread_Delegate()
        {
            
while (true)
            {
                Cli.Send(
"get");
                Thread.Sleep(
5000);
            }
        }

 

  客户端配置文件

  

客户端配置文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  
<appSettings>
    
<add key="ServerIP" value="127.0.0.1"/>
    
<add key="MusicPath" value="D:\Music\tomorrow.mp3"/>
  
</appSettings>
</configuration>

 

 

  播放音乐文件

  

播放文件
  1 using System;    
  2 using System.Runtime.InteropServices;     
  3 using System.Text;     
  4 using System.IO;
  5 using System.Windows.Forms;
  6 
  7 namespace StatusClient
  8 {
  9     public class Player
 10     {
 11 
 12         public Player()
 13         {
 14             //    
 15             // TODO: 在此处添加构造函数逻辑    
 16             //    
 17         }
 18 
 19         //定义API函数使用的字符串变量     
 20         [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
 21         private string Name = "";
 22         [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
 23         private string durLength = "";
 24         [MarshalAs(UnmanagedType.LPTStr, SizeConst = 128)]
 25         private string TemStr = "";
 26         int ilong;
 27         //定义播放状态枚举变量    
 28         public enum State
 29         {
 30             mPlaying = 1,
 31             mPuase = 2,
 32             mStop = 3
 33         };
 34         //结构变量    
 35         public struct structMCI
 36         {
 37             public bool bMut;
 38             public int iDur;
 39             public int iPos;
 40             public int iVol;
 41             public int iBal;
 42             public string iName;
 43             public State state;
 44         };
 45 
 46         public structMCI mc = new structMCI();
 47 
 48         //取得播放文件属性    
 49         public string FileName
 50         {
 51             get
 52             {
 53                 return mc.iName;
 54             }
 55             set
 56             {
 57                 //ASCIIEncoding asc = new ASCIIEncoding();     
 58                 try
 59                 {
 60                     TemStr = "";
 61                     TemStr = TemStr.PadLeft(127, Convert.ToChar(" "));
 62                     Name = Name.PadLeft(260, Convert.ToChar(" "));
 63                     mc.iName = value;
 64                     ilong = APIClass.GetShortPathName(mc.iName, Name, Name.Length);
 65                     Name = GetCurrPath(Name);
 66                     //Name = "open " + Convert.ToChar(34) + Name + Convert.ToChar(34) + " alias media";    
 67                     Name = "open " + Convert.ToChar(34+ Name + Convert.ToChar(34+ " alias media";
 68                     ilong = APIClass.mciSendString("close all", TemStr, TemStr.Length, 0);
 69                     ilong = APIClass.mciSendString(Name, TemStr, TemStr.Length, 0);
 70                     ilong = APIClass.mciSendString("set media time format milliseconds", TemStr, TemStr.Length, 0);
 71                     mc.state = State.mStop;
 72                 }
 73                 catch
 74                 {
 75                     MessageBox.Show("出错错误!");
 76                 }
 77             }
 78         }
 79         //播放    
 80         public void play()
 81         {
 82             TemStr = "";
 83             TemStr = TemStr.PadLeft(127, Convert.ToChar(" "));
 84             APIClass.mciSendString("play media", TemStr, TemStr.Length, 0);
 85             mc.state = State.mPlaying;
 86         }
 87         //停止    
 88         public void StopT()
 89         {
 90             TemStr = "";
 91             TemStr = TemStr.PadLeft(128, Convert.ToChar(" "));
 92             ilong = APIClass.mciSendString("close media", TemStr, 1280);
 93             ilong = APIClass.mciSendString("close all", TemStr, 1280);
 94             mc.state = State.mStop;
 95         }
 96 
 97         public void Puase()
 98         {
 99             TemStr = "";
100             TemStr = TemStr.PadLeft(128, Convert.ToChar(" "));
101             ilong = APIClass.mciSendString("pause media", TemStr, TemStr.Length, 0);
102             mc.state = State.mPuase;
103         }
104         private string GetCurrPath(string name)
105         {
106             if (name.Length < 1return "";
107             name = name.Trim();
108             name = name.Substring(0, name.Length - 1);
109             return name;
110         }
111         //总时间    
112         public int Duration
113         {
114             get
115             {
116                 durLength = "";
117                 durLength = durLength.PadLeft(128, Convert.ToChar(" "));
118                 APIClass.mciSendString("status media length", durLength, durLength.Length, 0);
119                 durLength = durLength.Trim();
120                 if (durLength == ""return 0;
121                 return (int)(Convert.ToDouble(durLength) / 1000f);
122             }
123         }
124 
125         //当前时间    
126         public int CurrentPosition
127         {
128             get
129             {
130                 durLength = "";
131                 durLength = durLength.PadLeft(128, Convert.ToChar(" "));
132                 APIClass.mciSendString("status media position", durLength, durLength.Length, 0);
133                 mc.iPos = (int)(Convert.ToDouble(durLength) / 1000f);
134                 return mc.iPos;
135             }
136         }
137     }
138 
139     public class APIClass
140     {
141         [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
142         public static extern int GetShortPathName(
143          string lpszLongPath,
144          string shortFile,
145          int cchBuffer
146         );
147 
148         [DllImport("winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto)]
149         public static extern int mciSendString(
150          string lpstrCommand,
151          string lpstrReturnString,
152          int uReturnLength,
153          int hwndCallback
154         );
155     }
156 }
157 

 

  程序比较简单,主要是想法挺有意思,当是的情景是地上点的蜡烛,打开房门的时候在手机浏览器上按下按钮,家里电脑音箱上的音乐随之响起,气氛烘托的很好。

  下面是程序执行的效果图:

  

  

posted @ 2011-01-27 18:53  寂静森林  阅读(925)  评论(2编辑  收藏  举报