一个消息提示托盘程序的开发历程(采用socket技术,附源代码)三---客户端源代码

类别:编程语言 点击:0 评论:0 推荐:

下面给出客户端程序,客户端相对复杂些,需要首先登陆,把登陆信息传给服务端,等待服务端的验证,如果验证通过,才
进入任务消息接受状态:
登陆:
Unit2.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
#include "Msg.h"
#include <iniFiles.hpp>

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TLoginForm *LoginForm;
String userName;
String serverIP;
String misurl;
int port;
//---------------------------------------------------------------------------
__fastcall TLoginForm::TLoginForm(TComponent* Owner)
        : TForm(Owner)
{
        isPass=false;
}
//---------------------------------------------------------------------------
void __fastcall TLoginForm::Button1Click(TObject *Sender)
{

            if(EditName->Text.Trim().Length()>=30){
               Application->MessageBox("用户名过长,请重新输入.",NULL,MB_OK);
            }
            else if(EditPwd->Text.Trim().Length()>=20){
               Application->MessageBox("密码过过长,请重新输入.",NULL,MB_OK);
            }
            else if(inet_addr(EditServer->Text.c_str())==0xffffffff){
               Application->MessageBox("IP地址设置有错,请重新设置.",NULL,MB_OK);

            }
            else{
                    ClientSocket1->Active=false;
                    ClientSocket1->Host=EditServer->Text;
                    ClientSocket1->Port=port;
                    ClientSocket1->Active=true;
            }

 }
//---------------------------------------------------------------------------

void __fastcall TLoginForm::ClientSocket1Error(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
    Application->MessageBox("无法连接到服务器,请确认服务端程序是否开启.",NULL,MB_OK);
    ErrorCode=0;
}
//---------------------------------------------------------------------------

void __fastcall TLoginForm::ClientSocket1Connect(TObject *Sender,
      TCustomWinSocket *Socket)
{
            userName = EditName->Text.Trim();
            serverIP = EditServer->Text.Trim();
            LoginInfo *loginfo = new LoginInfo;
            memcpy(loginfo->userID,userName.c_str(),userName.Length()+1);
            memcpy(loginfo->pwd,EditPwd->Text.Trim().c_str(),EditPwd->Text.Trim().Length()+1);
            ClientSocket1->Socket->SendBuf(loginfo,50);

            }
//---------------------------------------------------------------------------

void __fastcall TLoginForm::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
    MESSAGEINFO *Msg = new MESSAGEINFO;
    Socket->ReceiveBuf(Msg,244);
    if(Msg->MsgType==0xA){
    isPass=true;
                //写如INI
    char dir[MAX_PATH];
    char *tfile = "/Config.ini";
    //将程序现在目录所在输入此字符数组
    ::GetCurrentDirectory(MAX_PATH,dir);
    //将现在目录加上指定文件名
    strcat(dir,tfile);
    TIniFile  *ini = new TIniFile(dir);
    try{
       ini->WriteString("clientcfg","server",serverIP);
       ini->WriteString("clientcfg","user",userName);
       delete ini;
       }
    catch(...){
       Application->MessageBoxA("写入配置文件config.ini失败!",NULL,MB_OK+16);
       delete ini;
       }
    Close();
    }
   
    if(Msg->MsgType==0xB){
      Application->MessageBox("用户名或密码错误!",NULL,MB_OK);
    }
}
//---------------------------------------------------------------------------
void __fastcall TLoginForm::FormClose(TObject *Sender,
      TCloseAction &Action)
{
        ClientSocket1->Active=false;

}
//---------------------------------------------------------------------------
bool __fastcall TLoginForm::GetisPass()
{
        //TODO: Add your source code here
        return isPass;
}
void __fastcall TLoginForm::FormCreate(TObject *Sender)
{
char dir[MAX_PATH];
//----获取运行程序的目录开始
char *tfile = "/Config.ini";
//将程序现在目录所在输入此字符数组
::GetCurrentDirectory(MAX_PATH,dir);
//将现在目录加上指定文件名
strcat(dir,tfile);
//----获取运行程序的目录结束
TIniFile  *ini = new TIniFile(dir);
try
{
  EditName->Text = ini->ReadString("clientcfg","user","");
  EditServer->Text = ini->ReadString("clientcfg","server","");
  port = ini->ReadInteger("clientcfg","port",1555);
  misurl = ini->ReadString("clientcfg","misurl","http://192.168.1.101:7001/webmis/Login/loginController.jpf");
  delete ini;
}
catch(...)
{
  MessageBox(Application->Handle,"读取配置文件config.ini失败!","信息提示!",MB_OK+MB_ICONINFORMATION+MB_SYSTEMMODAL);
  delete ini;
}


}
//---------------------------------------------------------------------------


void __fastcall TLoginForm::EditServerDblClick(TObject *Sender)
{
        EditServer->ReadOnly = false;
        EditServer->Font->Color = clBlack;
}
//---------------------------------------------------------------------------

 

Unit2.h
//---------------------------------------------------------------------------

#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ScktComp.hpp>
#include <Mask.hpp>
#include <Buttons.hpp>
//---------------------------------------------------------------------------
class TLoginForm : public TForm
{
__published: // IDE-managed Components
        TButton *Button1;
        TGroupBox *GroupBox1;
        TLabel *Label1;
        TLabel *Label2;
        TEdit *EditName;
        TEdit *EditPwd;
        TLabel *Label3;
        TEdit *EditServer;
        TClientSocket *ClientSocket1;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall ClientSocket1Error(TObject *Sender,
          TCustomWinSocket *Socket, TErrorEvent ErrorEvent,
          int &ErrorCode);
        void __fastcall ClientSocket1Connect(TObject *Sender,
          TCustomWinSocket *Socket);
        void __fastcall ClientSocket1Read(TObject *Sender,
          TCustomWinSocket *Socket);
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall EditServerDblClick(TObject *Sender);
private:
        bool isPass;

public:
        bool __fastcall GetisPass();  // User declarations
        __fastcall TLoginForm(TComponent* Owner);
};

//---------------------------------------------------------------------------
extern PACKAGE TLoginForm *LoginForm;
extern String userName;     //用户
extern String serverIP;
extern int port;
extern String misurl;   
//---------------------------------------------------------------------------
#endif


登陆成功后,进入任务监听:
Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
#include "Msg.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Trayicon"
#pragma resource "*.dfm"
TForm1 *Form1;
TList *MsgList = new TList;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{


        isCall=false;
        if(serverIP.Length()>0){
                Server=serverIP;
                ClientSocket1->Host=Server;
                ClientSocket1->Port=port;
                ClientSocket1->Active=true;
                btnconnect->Enabled=false;
                btndisconnect->Enabled=true;
        }else{
        Application->Terminate();
        }

        StringGrid1->DefaultColWidth=50;
        StringGrid1->ColWidths[2]=600;
        StringGrid1->ColWidths[3]=100;
        GroupBox1->Caption=userName+"的任务列表";
        StringGrid1->Cells[0][0]="消息ID";
        StringGrid1->Cells[1][0]="负责人";
        StringGrid1->Cells[2][0]="任务名称";
        StringGrid1->Cells[3][0]="时间";

}
//---------------------------------------------------------------------------
void __fastcall TForm1::N2Click(TObject *Sender)
{
        Application->Terminate();       
}
//---------------------------------------------------------------------------


void __fastcall TForm1::TrayIcon1Click(TObject *Sender)
{

 if(isCall==true){
   isCall=false;
   TrayIcon1->IconIndex=0;
   }
}
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------


void __fastcall TForm1::Timer2Timer(TObject *Sender)
{

  if((isCall==true)){
  TrayIcon1->IconIndex=(GetTickCount()/500)%2;
  }

}
//---------------------------------------------------------------------------


void __fastcall TForm1::btnconnectClick(TObject *Sender)
{
if(InputQuery("连接到服务器","输入服务器地址:",serverIP)){
         if(inet_addr(serverIP.c_str())==0xffffffff){
              Application->MessageBox("IP地址设置有错,请重新设置.",NULL,MB_OK);
            }
         else{
            ClientSocket1->Host=serverIP;
            ClientSocket1->Active=true;
            btnconnect->Enabled=false;
            btndisconnect->Enabled=true;
         }
        }
}
//---------------------------------------------------------------------------


void __fastcall TForm1::ClientSocket1Connect(TObject *Sender,
      TCustomWinSocket *Socket)
{
StatusBar1->SimpleText="连接到:"+Server;
TrayIcon1->IconIndex = 0;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
      TCustomWinSocket *Socket)
{
        //接受服务器端传来的MESSAGE;
        MESSAGEINFO *Msg = new MESSAGEINFO;
        Socket->ReceiveBuf(Msg,244);
        if((Msg->MsgType==0xC)&&((String)Msg->UsrCode==userName)){
                //bool isAdd=true;
                MsgList->Add(Msg);
                /*
                for(int i=1;i<=StringGrid1->RowCount;i++){
                        if(StringGrid1->Cells[0][i]==(String)Msg->MessageID){
                                isAdd=false;
                        }
                }
                if(isAdd==true){
                        isCall=true;
                }
                */
        }
       
        if(Msg->MsgType==0xD){ //一次轮询结束
               //Label1->Caption = MsgList->Count+1;
               if((MsgList->Count+1)>StringGrid1->RowCount) isCall = true;
               if((MsgList->Count+1)!=StringGrid1->RowCount){
                        StringGrid1->RowCount=0;
                        for (int i = 0; i < MsgList->Count; i++) {
                                int rowcount=StringGrid1->RowCount;
                                StringGrid1->Cells[0][rowcount]=((MESSAGEINFO *)MsgList->Items[i])->MessageID;
                                StringGrid1->Cells[1][rowcount]=((MESSAGEINFO *)MsgList->Items[i])->UsrCode;
                                StringGrid1->Cells[2][rowcount]=((MESSAGEINFO *)MsgList->Items[i])->TastName;
                                StringGrid1->Cells[3][rowcount]=((MESSAGEINFO *)MsgList->Items[i])->CreatTime;
                                StringGrid1->RowCount++;
                        }
               }
               MsgList=NULL;
               MsgList = new TList;
               Label1->Caption = "您的任务数:"+IntToStr(StringGrid1->RowCount-1);

        }
 }

//---------------------------------------------------------------------------

void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
    btnconnect->Enabled=true;
    btndisconnect->Enabled=false;
    StatusBar1->SimpleText="无法连接到服务端!";
    TrayIcon1->IconIndex = 2;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::btndisconnectClick(TObject *Sender)
{
    ClientSocket1->Close();
    btnconnect->Enabled=true;
    btndisconnect->Enabled=false;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::ClientSocket1Error(TObject *Sender,
      TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode)
{
    StatusBar1->SimpleText="无法连接到:"+serverIP;
    ErrorCode=0;
    btndisconnect->Enabled=true;
    btnconnect->Enabled=false;
}
//---------------------------------------------------------------------------

//判断某人的任务数
TForm1::StrCount(String substing, String SourceStr)
{
     //TODO: Add your source code here
     int       sp    = substing.Length();
     int       pos   = SourceStr.Pos(substing);
     String    tmp;
     int       capa=0;
     while( pos > 0 )
     {
          tmp=SourceStr.SubString(1,pos-1);
          capa++;
          SourceStr=SourceStr.SubString(pos+sp,SourceStr.Length()-pos-sp+1);
          pos=SourceStr.Pos(substing);
     }
     return capa;
}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
        ClientSocket1->Close();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClick(TObject *Sender)
{
        delete MsgList;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::N3Click(TObject *Sender)
{
        N3->Enabled=false;
        FormAbout->ShowModal();
        N3->Enabled=true;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image1Click(TObject *Sender)
{
        ShellExecute(Handle,NULL,misurl.c_str(),NULL,NULL,SW_SHOWNORMAL);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormShow(TObject *Sender)
{
   if(!TrayIcon1->Visible)
        TrayIcon1->Visible=true;
   TrayIcon1->Minimize();
}
//---------------------------------------------------------------------------

 


Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include "Trayicon.h"
#include <ImgList.hpp>
#include <Menus.hpp>
#include <ADODB.hpp>
#include <Db.hpp>
#include <DBGrids.hpp>
#include <ExtCtrls.hpp>
#include <Grids.hpp>
#include <ScktComp.hpp>
#include <ComCtrls.hpp>
#include <Graphics.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
        TTrayIcon *TrayIcon1;
        TPopupMenu *PopupMenu1;
        TMenuItem *N2;
        TMenuItem *N3;
        TImageList *ImageList1;
        TTimer *Timer2;
        TGroupBox *GroupBox1;
        TClientSocket *ClientSocket1;
        TButton *btnconnect;
        TButton *btndisconnect;
        TStatusBar *StatusBar1;
        TStringGrid *StringGrid1;
        TImage *Image1;
        TLabel *Label1;
        void __fastcall N2Click(TObject *Sender);
        void __fastcall TrayIcon1Click(TObject *Sender);
        void __fastcall Timer2Timer(TObject *Sender);
        void __fastcall btnconnectClick(TObject *Sender);
        void __fastcall ClientSocket1Connect(TObject *Sender,
          TCustomWinSocket *Socket);
        void __fastcall ClientSocket1Read(TObject *Sender,
          TCustomWinSocket *Socket);
        void __fastcall ClientSocket1Disconnect(TObject *Sender,
          TCustomWinSocket *Socket);
        void __fastcall btndisconnectClick(TObject *Sender);
        void __fastcall ClientSocket1Error(TObject *Sender,
          TCustomWinSocket *Socket, TErrorEvent ErrorEvent,
          int &ErrorCode);
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
        void __fastcall FormClick(TObject *Sender);
        void __fastcall N3Click(TObject *Sender);
        void __fastcall Image1Click(TObject *Sender);
        void __fastcall FormShow(TObject *Sender);
private: // User declarations
        bool isCall;
        int capa; //任务数
        String Server;

public:  // User declarations
        __fastcall TForm1(TComponent* Owner);
        StrCount(String substing, String SourceStr);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

然后是about界面:
Unit3.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormAbout *FormAbout;
//---------------------------------------------------------------------------
__fastcall TFormAbout::TFormAbout(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TFormAbout::Button1Click(TObject *Sender)
{
ModalResult = mrOk;
}
//---------------------------------------------------------------------------


Unit3.h
//---------------------------------------------------------------------------

#ifndef Unit3H
#define Unit3H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
//---------------------------------------------------------------------------
class TFormAbout : public TForm
{
__published: // IDE-managed Components
        TButton *Button1;
        TImage *Image1;
        TLabel *Label2;
        TLabel *Label3;
        TLabel *Label1;
        TLabel *Label4;
        void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public:  // User declarations
        __fastcall TFormAbout(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TFormAbout *FormAbout;
//---------------------------------------------------------------------------
#endif

另外,登陆界面和任务监听主界面如何出现,需要在project中做如下修改(模式对话框)
project2.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#include "Unit2.h"
#pragma hdrstop
USERES("Project2.res");
USEFORM("Unit1.cpp", Form1);
USEFORM("Unit2.cpp", LoginForm);
USEFORM("Unit3.cpp", FormAbout);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 Application->Initialize();
                 TLoginForm *f = new TLoginForm(Application);
                 f->ShowModal();
                 if(!f->GetisPass()){
                        delete f;
                        return 0;
                 }

                 Application->CreateForm(__classid(TForm1), &Form1);
                // Application->CreateForm(__classid(TLoginForm), &LoginForm);
                 Application->CreateForm(__classid(TFormAbout), &FormAbout);
                 Application->Run();
        }
        catch (Exception &exception)
        {
                 Application->ShowException(&exception);
        }
        return 0;
}
//---------------------------------------------------------------------------

另外,客户端的配置文件Config.ini内容如下:
[clientcfg]
user=yinhm
server=192.168.1.55
port=1555
misurl=http://192.168.1.101:7001/webmis/Login/loginController.jpf

以上程序在bcb5编译通过。
以上的东东一是给自己存个档,二是希望对各位有所帮助,并希望牛人批评指正。
马上就要过年了,顺祝大家新年快乐,幸福吉祥

本文地址:http://com.8s8s.com/it/it23325.htm