用程序来烘托浪漫气氛,不要枯燥的编程
这个小程序是有一次给女朋友做小浪漫惊喜烘托气氛的,程序本身没有什么技术含量,只是思路挺有意思,先把程序功能说下。
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
)
[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 }
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);
}
}
/// 连接事件
/// </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>
<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, 128, 0);
93 ilong = APIClass.mciSendString("close all", TemStr, 128, 0);
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 < 1) return "";
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
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, 128, 0);
93 ilong = APIClass.mciSendString("close all", TemStr, 128, 0);
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 < 1) return "";
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
程序比较简单,主要是想法挺有意思,当是的情景是地上点的蜡烛,打开房门的时候在手机浏览器上按下按钮,家里电脑音箱上的音乐随之响起,气氛烘托的很好。
下面是程序执行的效果图: