需求是,做一个停车场车辆状态信息查询的应用,涉及到车场前端信息采集到服务器数据库,手机端查询。服务器是用C#编的,客户端java编的,前端采集不说了,我在数据库里模拟了一些采集到的数据,下面具体讲服务器和手机端数据交互的过程,手机发送指令给服务器,具体查询过程交由服务器完成,再将查询结果返回到手机客户端,这里面涉及到知识点有数据库操作、socket通信、json数据解析。
具体实现过程:
1. 数据库建立,我用的是一个小型数据库管理软件mysql,下载地址http://down.51cto.com/data/420104,mysql是dos黑框框操作界面,在下一个mysql的图形操作界面工具HAP_SQLyog_Enterprise_7.14,下载地址http://down.51cto.com/data/499101,mysql的安装教程这里就不说了。数据库建立如下:建了个数据库名字叫carinfo,表名叫carlocation,
2. 服务器。
服务器主要用来响应客户端的连接请求,用C#编写,采用socket的UDP通信方式,
首先为客户端监听开启一个线程
if (udpClient != null)
{
UdpThread.Abort();
Thread.Sleep(TimeSpan.FromMilliseconds(500d));
udpClient.Close();
}
try
{
udpClient = new UdpClient(8050);
UdpThread = new Thread(new ThreadStart(UdpReciveThread));
UdpThread.Start();
//UdpThread.Abort();
}
catch (Exception y)
{
MessageBox.Show(this, y.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.Dispose(true);
}
try
{
getport_state();
}
catch (Exception k) {
}
UDP通信模块,这块代码主要响应客户端的连接指令:
#region 采用UDP协议通信,响应客户端请求并回复
/// <summary>
/// 建立一个监听线程,采用UDP协议通信,响应客户端请求并回复
/// </summary>
void UdpReciveThread()
{
byte[] send_buf=null;
byte[] receive_buf=null;
String send_out=null;
IPHostEntry oIPHost = Dns.GetHostEntry(Environment.MachineName);
IPEndPoint remoteHost = new IPEndPoint(IPAddress.Any, 0);//获取远程主机地址
while (udpClient != null && Thread.CurrentThread.ThreadState.Equals(ThreadState.Running))
{
try
{
receive_buf = udpClient.Receive(ref remoteHost); //接收由远程主机发送的数据
string bufs = Encoding.UTF8.GetString(receive_buf);
uc = new UdpClient(remoteHost.Address.ToString(), remoteHost.Port); //此UDPclient是为了服务器给客户端发回应
if (bufs.StartsWith("#GETIN")) //客户端想要获取验证码,传回数据格式为:#GETIN|phone|starttime|endtime
{
string[] strs = new string[3];
strs = bufs.Split('|'); //strs[0]=#GETIN strs[1]=张三 strs[2]=13598055398
Random rd = new Random();
send_out = rd.Next().ToString();//产生随机数
send_buf = Encoding.UTF8.GetBytes(send_out);
uc.Send(send_buf, send_buf.Length);//发回客户端
string send_msg = "感谢你使用找车位,您的预约号为:" + send_out + ",请于24小时内使用,祝您生活愉快!";
send_CatMsg(strs[2], send_msg);//发短信
}
else if (bufs.StartsWith("#GETSTATE"))//查询停车场停车情况
{
send_out = get_carstate();
send_buf = Encoding.UTF8.GetBytes(send_out);
uc.Send(send_buf, send_buf.Length);
}
}
catch (Exception y)
{
//MessageBox.Show(y);
}
finally
{
uc.Close();
}
}
}
#endregion
mysql数据库操作部分:
#region 建立MySql数据库连接
/// <summary>
/// 建立数据库连接.
/// </summary>
/// <returns>返回MySqlConnection对象</returns>
public MySqlConnection getmysqlcon()
{
string M_str_sqlcon = "server=localhost;user id=root;password=123;database=carinfo"; //根据自己的设置
MySqlConnection myCon = new MySqlConnection(M_str_sqlcon);
return myCon;
}
#endregion
这段代码是查询数据库,并将查询结果以json数组格式返回。
#region 查询数据库中车辆位置,和状态,并返回json数组
/// <summary>
/// 查询数据库中车辆位置,和状态,并返回json数组
/// </summary>
/// <returns>将查询数组以json数组形式返回</returns>
public string get_carstate()
{
MySqlConnection mysqlcon = this.getmysqlcon();
string sql = "select * from carlocation";
string result = null;
MySqlCommand mysqlcom = new MySqlCommand(sql, mysqlcon);
mysqlcon.Open();
MySqlDataReader reader = mysqlcom.ExecuteReader();//用mysqldatareader查询数据库
StringBuilder htmlStr = new StringBuilder("");
htmlStr.Append("[");
while (reader.Read())
{ //将查询结果分封成json数组
htmlStr.Append("{'ID':" + reader["ID"] + ","); //json 格式为:[{"ID":1,"layout_x":20,"layout_y":30,"state":1},{},{},{}]
htmlStr.Append("'layout_x':" + reader["layout_x"] + ",");
htmlStr.Append("'layout_y':" + reader["layout_y"] + ",");
htmlStr.Append("'state':" + reader["state"]);
htmlStr.Append("},");
}
htmlStr.Remove(htmlStr.ToString().LastIndexOf(','), 1);
htmlStr.Append("]");
result = htmlStr.ToString(); //json数组变成string类型
reader.Close();
mysqlcon.Close(); //关闭数据库
return result;
}
#endregion
服务器上主要功能函数就是这些了,最后会附上完整的代码。
3.android手机客户端
android手机端通信代码相对简单,主要就是建立一个socket连接,再发送指令,并接收返回的指令,解析一下就好了。
socket = new DatagramSocket(8050);
InetAddress serverAddress = InetAddress.getByName("192.168.0.11");
//发送请求
String str = "#GETSTATE";
byte data [] = str.getBytes();
packet_send = new DatagramPacket(data,data.length,serverAddress,8050);
socket.send(packet_send);
System.out.println("data...:"+data);
//接收到回应
byte data1 [] = new byte[1024];
packet_rece = new DatagramPacket(data1,data1.length);
socket.receive(packet_rece);
String result = new String(packet_rece.getData(),packet_rece.getOffset(),packet_rece.getLength());
//数据解析
System.out.println("result-------->"+result);