添加一个连接控件TSocketConnection,该连接控件是使用TCP/IP协议来建立应用程序服务器和客户端的连接,因而适用于企业内部网和Internet。但若采用这种连接方式,在服务器端必须运行ScktSrvr.exe,该文件放在C++ Builder的bin目录里面。如果客户端和服务器之间有防火墙,还必须开放Socket Server所指定的端口,默认是211,客户端还要把MIDAS.DLL文件放在系统目录里面。
③、 设置TSocketConnection的Address属性为应用程序服务器的IP地址,并在ServerName属性里选择服务器名,即刚才建立的应用程序服务器。再把其Connected属性设置为真,这时,应用程序就被激活了。
④、 添加一个TClientDataSet、一个TdataSource和一个TDBGrid,其属性分别设为:
TClientDataSet:
RemoteServer SocketConnection1
ProviderName DataSetProvider1
Active ture
TDataSource:
DataSet ClientDataSet1
TDBGrid:
DataSource DataSource1
这样,一个客户端应用程序就完成了,这时,我们就可以在TDBGrid控件上看到表XXXX的内容。
⑶、几个实用小技巧
①、 如何把SQL命令从客户端程序传给应用程序服务器运行
首先在服务器端把DataSetProvider1/Options/poAllowCommandText设为true
其次在客户端的某个执行控件上写入如下代码:
ClientDataSet1->Active = false;
ClientDataSet1->CommandText =”select * from YYYY” ;
ClientDataSet1->Active = true;
这时就可以把SQL语句传到服务器端了,当然,SQL语句可以是多样的,可按实际需求去写。
②、 分段传递数据
当客户端进行数据操作,比如查询操作时,服务器是把所有的查询结果整个打包,一次性发送到客户端,当数据量很大时就会影响速度,浪费时间。因为用户在界面上一次性所看到的数据有限,因此,我们可以用分段传递数据的方法解决这个问题。方法如下:
可以参考以下信息设置ClientDataSet的PacketRecords属性:
-1:将整个DataSet从应用程序服务器一次传到客户端
0:把数据库服务器上的meta data取到客户端,meta data就是数据库的所有定义数据,如Table、Column、Constraint等。
大于0:一次取到客户端的记录数,注意FetchOnDemand应设为false。
③、与服务器通讯(软件握手)
用此方法可以从客户端传数据到应用程序服务器端。在这里举例的是把客户端Edit1的内容和客户端所在计算机的IP地址传到服务器端,实现方法如下:
ⅰ.在客户端添加一个TEdit,一个TButton和一个TIdIPWatch控件,双击Button控件,写入以下代码:
AnsiString IPAdress;
IPAdress=IdIPWatch1->LocalIP();
ClientDataSet1->DataRequest(Edit1->Text+'+'+IPAdress);
ⅱ.双击服务器端的DataSetProviderEventsOnDataRequest,在该函数里输入以下代码:
AnsiString str=Input;
AnsiString Username,IPAdress;
int Lenth=str.Length();
int Count=0;
char *buf=new char[Lenth+1];
strcpy(buf,str.c_str());
for(int i=0;i<=Lenth;i++)
{
if(buf[i]!=(char)'+')
{
Username+=buf[i];
Count++;
}
else break;
}
for(int i=Count+1;i<=Lenth;i++)
{
IPAdress+=buf[i];
}
这样就可以把从客户端传过来的Edit里的内容和客户端计算机的IP地址赋值给了Username和IPAdress
④、远程方法
通过远程方法,服务器端不仅能接收到客户端传过来的参数,而其还能返回参数给客户端,客户端可以根据服务器端传过来的参数做出相应的判断。
服务器端设置及代码如下:
View/Type Library 在接口中new/Modth,然后设置参数,其中参数的类型,如果是从客户端传过来的参数设置为BSTR类型,从服务器端传回给客户端的参数设置为BSTR*类型。如添加了一个名为denglu的方法,参数设置如图:

则在服务器端就会出现这样的方法:
STDMETHODIMP TUSEdemoImpl::denglu(BSTR UserName, BSTR IPAdress,
BSTR* Acdept)
{
}
在方法里可以添加相应的代码,以实现所要求的功能。如,在里面添加这样的代码:
AnsiString Username=UserName;
AnsiString IPadress=IPAdress;
int Count= Form1->StringGrid1->RowCount-1;
int n=0;
for(int i=0;i<=Count;i++)
if(Username!=Form1->StringGrid1->Cells[1][i]||(Username==Form1->StringGrid1->Cells[1][i]&&IPadress==Form1->StringGrid1->Cells[2][i]))
n++;
else
break;
if(n==Count)
*Acdept=WideString('tru');
else
*Acdept=WideString('fall');
return S_OK;
实现的功能是把客户端传过来的参数与服务器端网格中的内容相比较,如符合要求就给客户端传送字符串“fall”,如没有符合要求的就传字符串“tru”。 2/3 首页 上一页 1 2 3 下一页 尾页 |