INDY 9有tidtcpclient , tidtcpserver , tidudpclient , tidudpserver
其中tidtcpserver , tidudpserver 都有处理接收数据的事件分别是OnExecute 和OnUDPRead用来处理客户端发送过来的数据,就如同BORLAND自带的winsocket控件和NMUDP控件处理onread ondatareceive这些事件等等。但是tidtcpclient , tidudpclient 没有这些事件,我的问题是如何给tidtcpclient , tidudpclient 添加上实现接收数据并处理数据的功能,尤其是服务器主动发送数据包给客户端的时候。
其中tidtcpserver , tidudpserver 都有处理接收数据的事件分别是OnExecute 和OnUDPRead用来处理客户端发送过来的数据,就如同BORLAND自带的winsocket控件和NMUDP控件处理onread ondatareceive这些事件等等。但是tidtcpclient , tidudpclient 没有这些事件,我的问题是如何给tidtcpclient , tidudpclient 添加上实现接收数据并处理数据的功能,尤其是服务器主动发送数据包给客户端的时候。
BTW,Indy是阻塞的,所以如果没有数据到达的话工作线程会停在那,直到读到数据或者出现异常。
ontimer( )
{readln( );//或者是receivestring( )<----------假如没有数据到达的话,就会一直停在这里么?直到有数据到达,才继续执行吗?TThread也是如此吗?
}我用的是BCB,兼用DELPHI,还有tthread是BORLAND里面的tthread还是INDY里面的tidthread呢?如果是用线程的话能详细说说?顺便给个例子代码。很感谢啊!
贴一段使用TThread的代码://---------------------------------------------------------------------------
/* 头文件 ClientThread.h */#ifndef ClientThreadH
#define ClientThreadH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include "ClientFrm.h"
//---------------------------------------------------------------------------
class TClientThread : public TThread
{
private:
TfrmClient *FMainForm;
AnsiString FUserName;
AnsiString FMsgString;
bool FMsgFlag;
protected:
void __fastcall Execute();
void __fastcall DoWriteMsg();
public:
__fastcall TClientThread(TfrmClient *AForm, bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------#include <vcl.h>
#pragma hdrstop#include "ClientThread.h"
#include "ClientFrm.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------__fastcall TClientThread::TClientThread(TfrmClient *AForm, bool CreateSuspended)
: TThread(CreateSuspended)
{
FMainForm = AForm;
FUserName = FMainForm->edt_Name->Text;
FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
void __fastcall TClientThread::DoWriteMsg()
{
FMainForm->WriteMsg(FMsgString, FMsgFlag);
}
//---------------------------------------------------------------------------
void __fastcall TClientThread::Execute()
{
//---- Place thread code here ----
TIdTCPClient *AClient = FMainForm->tcpClient;
while(!Terminated && AClient->Connected())
{
try
{
FMsgString = AClient->ReadLn("");
}
catch(...)
{
MessageBox(FMainForm->Handle, "AClient->ReadLn() Failed!",
"TClientThread", MB_OK);
Terminate();
break;
}
if(FMsgString.Length() < 5
|| FMsgString.Pos("@") != 1
|| FMsgString.Pos(":") != 5) continue;
AnsiString strCmd = UpperCase(FMsgString.SubString(2, 3));
if(strCmd == "BYE")
{
AClient->Disconnect();
FMsgString = "TClientThread::Excute() 同服务器的连接已经断开。";
FMsgFlag = true;
Synchronize(DoWriteMsg);
break;
}
else if(strCmd == "WEL")
{
FMsgString = "正在发送登录名称...";
FMsgFlag = true;
Synchronize(DoWriteMsg);
AClient->WriteLn("@REN:" + FUserName);
FMsgString = "发送成功,已经完成登录!";
FMsgFlag = true;
Synchronize(DoWriteMsg);
}
else if(strCmd == "MSG" || strCmd == "SYS")
{
if(FMsgString.Length() > 5)
{
FMsgString = FMsgString.SubString(6, FMsgString.Length() - 5);
if(strCmd == "MSG")
FMsgFlag = false;
else
FMsgFlag = true;
Synchronize(DoWriteMsg);
}
}
}
}
//---------------------------------------------------------------------------