C++Builder创建基于Internet点对点Chat
要创建基于互联网的应用程序,您可能会想到复杂的WinSock编程。但是C++ Builder3提供了一个新的WebBroker的互联网套件,其中TClientSocket和TServerSocket组件封装了Windows的相关API,大大简化了WinSock编程。要通过互联网传输数据,至少需要一对套接字,一个套接字在客户端,另一个套接字在服务器端。实际上,TClientSocket和TServerSocket组件并不是Socket对象,它们的属性Socket会返回各自的Socket对象。TClientSocket用于处理客户端和服务器之间的套接字连接,TServerSocket用于处理客户端发送的套接字连接。一旦客户机和服务器都连接到套接字,客户机和服务器就可以相互通信。
创建新项目以创建应用程序的用户界面:
1.将组件页面切换到Internet页面,并在表单上放置一个TServerSocket组件和一个TClientSocket组件,这样应用程序既可以是TCP/IP服务器,也可以是TCP/IP客户端。将Port属性设置为相同的值(如1000),并确保Socket之间的连接类型是非阻塞的。
2.在表单上放置两个TMemo组件,分别用于显示双方的通话内容,并将Memo2的ReadOnly属性设置为True。
3.在表单顶部放一个面板组件,上面放三个按钮:listen (btnlisten)、connect (btnconnect)和disconnect (btndisconnect)来启动相应的操作。
4.在表单底部放置一个StatusBar组件,将其SimplePanel属性设置为True,并在相应的事件处理程序中更改状态栏信息,让用户随时了解连接状态。
打开头文件,在form类的Private部分添加两个私有成员:bool IsServer字符串服务器.双方在交流时需要同时运行聊天程序。IsServer用于确定哪个聊天程序在服务器端,Server用于存储服务器的主机名。form类的构造函数如下:
fast call t form 1::t form 1(t component * Owner)
:t form(Owner)
{
is server = false;
Server = " localhost ";
}
这里服务器默认设置为localhost,这样就可以在没有联网的单台机器上调试程序。在Windows子目录中,您可以找到hosts.sam文件,其中定义了本地IP地址127.0.0.1的主机名:
本地主机.
void _ _ fast call t form 1::form create(to object * Sender)
{
btndisconnect--> Enabled = false;
}
程序运行后,如果用户按下“Monitor”按钮,程序将被设置到服务器端。此时TServerSocket的Active属性应该设置为True,这样服务器会自动进入监听状态。
void _ _ fast call t form 1::btnlistenClick(to object * Sender)
{
clientsocket 1-> Active = false;
server socket 1-> Active = true;
status bar 1--> simple text = " Listening ... ";
BTN listen--> Enabled = false;
BTN connect-> Enabled = false;
}
当用户按下“连接”按钮时,程序会弹出一个询问框,要求用户输入要连接的服务器的主机名,然后建立连接。
void _ _ fastcalltform 1::btnconnectclick(to object * sender)
{
if(输入查询("连接到服务器","输入服务器地址:",服务器)){
if(server . length()> 0)
clientsocket 1-> Active = true;
BTN listen--> Enabled = false;
BTN connect-> Enabled = false;
btndisconnect-> Enabled = true;
}
}
}
当用户发出连接请求时,客户端将触发OnCreate事件。程序会先在状态栏显示连接信息,然后清除显示对方对话内容的Memo2 空,准备开始对话。
void _ _ fastcalltform 1::clientsocket 1 connect(to object * sender,
tcustomwinsocket * socket)
{
status bar 1-> simple text = " connected to:"+Server;
memo 2-> Lines-> Clear();
}
0条评论