⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c14_1f.cpp

📁 C++Builder编程实例详解,用具体的例子阐明C++的一些基本操作,所有程序均在BC++上编译过.可靠,建议下载
💻 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 + -