void __fastcall tform1::formcreate(tobject *sender)
{
btndisconnect- >enabled=false;
}
---- 程序运行后,如果用户按下"监听"钮,则将该程序设为服务器端,这时应将tserversocket的active属性设为true,使服务器自动进入监听状态。
void __fastcall tform1::btnlistenclick(tobject *sender)
{
clientsocket1- >active=false;
serversocket1- >active=true;
statusbar1- >simpletext="正在监听...";
btnlisten- >enabled=false;
btnconnect- >enabled=false;
}
---- 当用户按下"连接"钮后,程序会弹出一个询问框,要求用户输入要连接的服务器的主机名,然后建立连接。
void __fastcall tform1::btnconnectclick(tobject *sender)
{
if(inputquery("连接到服务器","输入服务器地址:",server)){
if(server.length() >0){
clientsocket1- >host=server;
clientsocket1- >active=true;
btnlisten- >enabled=false;
btnconnect- >enabled=false;
btndisconnect- >enabled=true;
}
}
}
---- 当用户提出连接请求后,客户端会触发oncreate事件,程序先在状态条中显示连接信息,然后将显示对方谈话内容的memo2清空,准备开始交谈。
void __fastcall tform1::clientsocket1connect(tobject *sender,
tcustomwinsocket *socket)
{
statusbar1- >simpletext="连接到:"+server;
memo2- >lines- >clear();
}
---- 在服务器接受了客户的请求后会触发onaccept事件,在这个事件处理程序中将标志服务器端的变量isserver设为true,并准备开始交谈。
void __fastcall tform1::serversocket1accept(
tobject *sender,
tcustomwinsocket *socket)
{
memo2- >lines- >clear();
isserver=true;
statusbar1- >simpletext="连接到:"
+socket- >remoteaddress;
}
---- 在建立连接后,双方就可以在memo1中输入谈话内容开始进行交谈了,按下enter键后,将所在行的文本发送出去。服务器端的socket的connections
属性返回一个数组,该数组由服务器当前活动的连接组成。
void __fastcall tform1::memo1keydown(
tobject *sender, word &key,
tshiftstate shift)
{
if(key==vk_return){
if(isserver)
serversocket1- >socket- >connections[0]- >sendtext(
memo1- >lines- >strings[memo1- >lines- >count-1]);
else
clientsocket1- >socket- >sendtext(
memo1- >lines- >strings[memo1- >lines- >count-1]);
}
}
---- 在本例中我们采用非阻塞传输方式,当其中的一方进行写操作时,另一方会触发onread事件(客户端)或onclientread事件(服务器端),这两个事件的处理程序只是将接收到的内容添加到memo2的后面。
memo2- >lines- >add(socket- >receivetext());
---- 如果在用户建立连接后单击"断开"钮,将断开客户端与服务器的连接,服务器端将触发onclientdisconnect事件,而客户端则会触发ondisconnect事件,这时服务器端应回到监听状态,等待用户的连接;而客户端将返回到连接前的状态,等待用户再次建立连接,如果有不止一个服务器的话,可以选择连接到其他的服务器上。
void __fastcall tform1::btndisconnectclick(
tobject *sender)
{
clientsocket1- >close();
}
void __fastcall tform1::serversocket1clientdisconnect(
tobject *sender,
tcustomwinsocket *socket)
{
statusbar1- >simpletext="正在监听...";
}
void __fastcall tform1::clientsocket1disconnect(
tobject *sender, tcustomwinsocket *socket)
{
btnlisten- >enabled=true;
btnconnect- >enabled=true;
btndisconnect- >enabled=false;
statusbar1- >simpletext="";
}
---- 此外在客户端还应该增加错误捕获机制,当用户输入无效的服务器名或服务器端没有处于监听状态时能够及时给用户反馈信息。
void __fastcall tform1::clientsocke
t1error(tobject *sender,
tcustomwinsocket *socket,
terrorevent errorevent, int &errorcode)
{
statusbar1- >simpletext="无法连接到:
"+socket- >remotehost;
errorcode=0;
}
以上步骤完成后,socket就可以run了。是不是没有想象中的困难?
三:关于托盘,bcb给出了很简单的实现方法:
下面让我们来编一个简单的tary程序:
1、新建工程,添加一个trayicon组件、一个popupmenu组件和一个imagelist组件。它们的name属性都用默认的名字:trayicon1、
popupmenu1、imagelist1。
2、设置trayicon1的属性,如下:
属性 值
animate true
animateinterva 1000
hide true
hint tary演示程序
iconindex 0
icons imagelist1
name trayicon1
popupmenu popupmenu1
popupmenuon imrightclickup
restoreon imdoubleclick
visible true
3、双击popupmenu1,弹出菜单设计器,随意地加入几个菜单项。
4、双击imagelist1,加入支持的图片(*.ico、*.bmp)。
到此,不用编写一句程序代码,一个简单的tary程序就做好了。按f9编译运行,将鼠标移动到tary上面就会出现“tary演示程序”的提示信息;