代码改变世界

购票系统设计

2013-04-10 19:23  Keiven_LY  阅读(533)  评论(0编辑  收藏  举报

6.1 项目说明

该实例服务宿主为Windows窗体应用程序,客户端也为Windows窗体应用程序。

6.2 项目架构

6.3 项目开发过程

6.3.1 服务端设计

第一步:创建一个空的解决方案,命名为“WCF_TicketWinForm”,(可以任意取名);

第二步:在上述解决方案中,文件——>添加——>新建项目,选择Windows窗体应用程序,取名TicketServerHost,这个Windows窗体应用程序用来作为服务的宿主程序;

第三步:在解决方案中,右键TicketServerHost——>添加——>新建项,选择WCF服务,取名TicketService,系统自动生成ITicketService.cs、TicketService.cs、App.config。其中ITicketService.cs为接口,在此添加契约,相当于web service中的methord;TicketService.cs为契约的实现方法;

 

ITicketService.cs中的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace TicketServerHost
{
    // 注意: 如果更改此处的接口名称 "ITicketService",也必须更新 App.config 中对 "ITicketService" 的引用。
    [ServiceContract]
    public interface ITicketService
    {
        [OperationContract]
        void DoWork();          /* 系统自动生成的*/

        [OperationContract]    /* 增加车票的方法*/
        void AddTicket(int count);

        [OperationContract]    /*购买车票的方法*/
        int BuyTickets(int Num);

        [OperationContract]    /*查询车票的方法*/
        int GetRemainingNum();

    }
    // 使用下面示例中说明的数据约定将复合类型添加到服务操作。
    [DataContract]   //数据契约  
    public class Ticket
    {
        bool boolCount = true; //判断是否还有车票
        int howmany = 10;      //车票预设张数

        [DataMember]    /*判断是否还有票*/
        public bool BoolCalue
        {
            get { return boolCount; }
            set
            {
                if (HowMany > 0)
                {
                    boolCount = false;
                }
                else
                {
                    boolCount = true;
                }
            }
        }
        [DataMember]    /*返回票数*/
        public int HowMany
        {
            get { return howmany; }
            set { howmany = value; }
        }
    }
}

TicketService.cs中的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace TicketServerHost
{
    // 注意: 如果更改此处的类名 "TicketService",也必须更新 App.config 中对 "TicketService" 的引用。
    public class TicketService : ITicketService
    {
        public void DoWork()
        {
        }   //系统自动生成的

        Ticket T = new Ticket();
        /*实现添加票数的方法*/
        public void AddTicket(int count)
        {
            T.HowMany = T.HowMany + count;
        }
        /*实现返回票数的方法*/
        public int GetRemainingNum()
        {
            return T.HowMany;
        }
        /*实现购买车票的方法*/
        public int BuyTickets(int Num)
        {
            if (T.BoolCalue)
            {
                T.HowMany = T.HowMany - Num;
                return 1;
            }
            else
            {
                return 0;
            }
        }
    }
}

修改App.config中的地址为:http://localhost:8731/TicketService/

第四步:在窗体中添加两个Button,命名为:“开启服务”,“停止服务”,另外,再添加一个Label

第五步:转到上述窗体代码,右击TicketServerHost项目中的“引用”——>“添加引用”

在代码中引入下述命名空间:

using System.ServiceModel;

第六步:在代码中实例化一个ServiceHost,如下:

ServiceHost host = null;//定义 ServiceHost 这个必须定义

第七步:双击“开启服务”按钮,转到其click事件,代码如下:

private void button1_Click(object sender, EventArgs e)
  {
            host = new ServiceHost(typeof(TicketServerHost.TicketService));  
            host.Open();
            this.label1.Text = "服务已启动";
   }

第八步:双击“停止服务”按钮,转到其click事件,代码如下:

private void button2_Click(object sender, EventArgs e)
{
      if (host.State != CommunicationState.Closed)//判断服务是否关闭
       {
           host.Close();//关闭服务
        }
       this.label1.Text = "服务已关闭";
}

第九步:运行程序,如图:

点击“开启服务”按钮,如图:

第十步:将App.config中修改的地址http://localhost:8731/TicketService/放在浏览器中查看,若显示如下

 

点击上面的svcutil.exe链接,若出现下图,说明该服务发布成功

            至此,服务器端编写成功!

6.3.2 客户端设计

第一步:在上述解决方案中,文件——>添加——>新建项目,在左侧的项目类型中选择Visual Basic——>Windows在右侧的Visual Studio已安装模板中选择Windows窗体应用程序,取名为TicketServerClient,如图:

第二步:进入后台代码,在TicketServerClient项目中,右键“引用”——>“添加引用”

在代码添加下述命名空间:

using System.ServiceModel;

第三步:找到服务器端的TicketServerHost.exe文件,并双击,

点击“开启服务”按钮,显示如下:

第四步:在TicketServerClient项目中,右键“TicketServerClient”——>添加服务引用,如图

第五步:将App.config中的地址,复制到上图的地址栏中,点击前往,找到该服务,并修改命名空间为TicketService,如图:

点击确“确定”按钮即可。

第六步:设计客户端界面,如图

第七步:编写后台代码如下:

using System;
using System.ServiceModel;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TicketServerClient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)  //购买车票
        {
            using (TicketService.TicketServiceClient proxy_1 = new TicketService.TicketServiceClient())  //创建代理,用于连接服务器
            {
                int i = proxy_1.BuyTickets(Convert.ToInt32(this.txt2.Text)); //调用WCF中的方法
                if (i == 1)
                {
                    this.txt1.Text = "购买成功,";
                }
                this.txt1.Text += "剩余车票还有" + proxy_1.GetRemainingNum().ToString();

            }
        }
        private void button2_Click(object sender, EventArgs e)  //查询票价
        {
            using (TicketService.TicketServiceClient proxy_2 = new TicketService.TicketServiceClient())  //创建代理,用于连接服务器
            {
                this.txt2.Text = "";
                this.txt1.Text = "";
                this.txt3.Text = proxy_2.GetRemainingNum().ToString();//调用WCF中的方法
            }
        }
        private void button3_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}

第八步:保存,重新生成解决方案,运行结果如下:

点击“查询车票”按钮,弹框显示:

填写购买车票张数 5 ,点击“购买车票”按钮,弹框显示:

结束!!!