📄 c14_1f.cpp
字号:
//----------------------------------------------------------------------------
// 本程序是一个简单的闲聊程序
// 程序利用TCP控件建立连接,传输数据。
// 首先由服务器程序开始监听网络,
// 当客户程序申请连接时,触发服务程序的TCP1控件的OnConnectRequest事件,
// 在事件处理程序中,执行TCP2的Accept方法实现连接。
// 注意:
// 在TCP通信程序中,不能由一个控件同时完成监听与连接的功能。
// 必须由监听控件(TCP1)监听网络,当收到连接申请时
// 由另一个控件(TCP2)实现连接。
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include "C14_1f.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString Server; // 用于保存远程主机地址
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TCP1Close(TObject *Sender)
// 当用于监听网络的控件TCP1关闭(停止监听)时,触发该事件。
{
ShowMessage("TCP1->Close");
// 设置状态条
StatusBar1->Panels->Items[0]->Text = "结束连接";
}
//---------------------------------------------------------------------
void __fastcall TForm1::TCP1ConnectionRequest(TObject *Sender,
int requestID)
// 当客户程序申请连接时,监听程序触发该事件
{
FileListenItem->Checked = false;
if(TCP1->State != sckClosed)
TCP1->Close(); // 结束监听
TCP2->Accept(requestID); // 建立连接
StatusBar1->Panels->Items[0]->Text = "连接到: " + TCP1->RemoteHostIP;
}
//---------------------------------------------------------------------
void __fastcall TForm1::TCP1Error(TObject *Sender, short Number,
AnsiString &Description, int Scode, const AnsiString Source,
const AnsiString HelpFile, int HelpContext, WordBool &CancelDisplay)
{
ShowMessage(Description); // 显示错误信息
}
//---------------------------------------------------------------------
void __fastcall TForm1::TCP2Close(TObject *Sender)
// 当连接由客户程序终止时,触发该事件。
{
FileListenItem->Checked = false;
if(TCP1->State != sckClosed)
TCP1->Close(); // 结束监听
if(TCP2->State != sckClosed)
TCP2->Close(); // 关闭连接控件
TCP1->Listen();
StatusBar1->Panels->Items[0]->Text = "开始监听...";
}
//---------------------------------------------------------------------
void __fastcall TForm1::TCP2Connect(TObject *Sender)
{
if( TCP1->State == sckListening)
{
TCP1->Close(); // 停止监听,
// 以保证在连通时不会收到其它连接申请
FileListenItem->Checked = false; // 取消菜单设置
}
StatusBar1->Panels->Items[0]->Text = "连接到: " + Server;
}
//---------------------------------------------------------------------
void __fastcall TForm1::TCP2DataArrival(TObject *Sender,
int bytesTotal)
{
Variant Data; // 设置接收缓冲区
// Variant 类是可变数据类,用于处理不同类型的数据。
TCP2->GetData(Data, VT_BSTR, bytesTotal); // 接收数据
Memo2->Lines->Add(Data); // 在Memo2中显示
}
//---------------------------------------------------------------------
void __fastcall TForm1::TCP2Error(TObject *Sender, short Number,
AnsiString &Description, int Scode, const AnsiString Source,
const AnsiString HelpFile, int HelpContext, WordBool &CancelDisplay)
// 当连接错误或数据传输错误时,触发该事件。
{
ShowMessage(Description); // 显示错误信息
}
//---------------------------------------------------------------------
void __fastcall TForm1::Memo1KeyDown(TObject *Sender, Word &Key,
TShiftState Shift)
{
if( Key == VK_RETURN)
// 如果按回车键,发送当前行
if(TCP2->State == sckConnected)
{ // 成功的建立了连接
TCP2->SendData(Memo1->Lines->Strings[Memo1->Lines->Count - 1]);
}
else
{ // 未建立连接
StatusBar1->Panels->Items[0]->Text = "警告!未建立连接";
}
}
//---------------------------------------------------------------------
void __fastcall TForm1::FileListenItemClick(TObject *Sender)
{
FileListenItem->Checked = !FileListenItem->Checked;
if(FileListenItem->Checked)
{
TCP2->Close(); // 关闭连接(不触发OnClose事件)
TCP1->LocalPort = 1024; // 设置监听端口
// TCP程序需要指定端口号,
// 小于1024的端口号常有特殊定义
// 如:FTP程序使用20、21,HTTP程序使用80等
// 自定义程序应使用不小于1024的端口号。
TCP1->Listen(); // 开始监听
StatusBar1->Panels->Items[0]->Text = "开始监听...";
}else{
if(TCP1->State != sckClosed)
TCP1->Close(); // 结束监听
StatusBar1->Panels->Items[0]->Text = " ";
}
}
//---------------------------------------------------------------------
void __fastcall TForm1::FileConnectItemClick(TObject *Sender)
// 选择菜单中的申请连接项,执行该程序
{
if(TCP2->State != sckClosed)
TCP2->Close();
if(InputQuery("连接主机", "输入地址 (IP地址或主机名):", Server))
// 提示用户输入服务器地址,判断输入
if(Server.Length() > 0)
{
TCP2->Connect(Server, 1024); // 以1024(与服务器监听端口相同)端口连接服务器
StatusBar1->Panels->Items[0]->Text = "开始监听...";
}
}
//---------------------------------------------------------------------
void __fastcall TForm1::DisconnectClick(TObject *Sender)
{
TCP2->Close(); // 关闭连接(不触发OnClose事件)
StatusBar1->Panels->Items[0]->Text = "结束连接...";
}
//---------------------------------------------------------------------
void __fastcall TForm1::Exit1Click(TObject *Sender)
{
TCP1->Close();
TCP2->Close();
Close();
}
//---------------------------------------------------------------------
void __fastcall TForm1::sClearClick(TObject *Sender)
{
Memo1->Clear();
Memo2->Clear();
}
//---------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -