Indy客户/服务器网络编程的几个问题

ooolinux 2018-02-10 10:12:30
1、服务器端IdTCPServer1->Active=false;断开连接后,客户端能否得知?
2、客户端连接到服务器后,TIdTCPClient有没有一个属性判断是否已连接?
3、用TIdNotify::NotifyMethod()编译时警告如下,有没有替代的方法/函数?
[bcc32 Warning] ServerMain.cpp(42): W8111 Accessing deprecated entity 'TIdNotify'
[bcc32 Warning] ServerMain.cpp(42): W8111 Accessing deprecated entity '_fastcall TIdNotify::NotifyMethod(TThreadMethod)'
4、Indy为什么没有最新版手册呢,还是10.1.5的?
...全文
1395 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2018-02-12
  • 打赏
  • 举报
回复
这个代码能不能简化?每次都要通过 LockList 才能获得 AContext 吗?
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	if(Edit2->Text=="")
	{
		ShowMessage("无内容");
		return;
	}
	if(IdTCPServer1->Contexts->Count()<1)
	{
		ShowMessage("客户端未连接");
		return;
	}
	try
	{
		TIdContextList *AList=IdTCPServer1->Contexts->LockList();
		TIdContext *AContext=(TIdContext *)AList->Items[0];
		AContext->Connection->IOHandler->WriteLn(Edit2->Text,IndyTextEncoding(TEncoding::Default));
		Edit2->Text="";
	}
	__finally
	{
		IdTCPServer1->Contexts->UnlockList();
    }
}
//---------------------------------------------------------------------------
ooolinux 2018-02-12
  • 打赏
  • 举报
回复
@早打大打打核战争 明白了~
  • 打赏
  • 举报
回复
因为Contexts是线程安全的List,只能先LockList再访问它的内部List,可以写一个函数(LockList、读List、UnlockList)返回它的指定Index的Context。
ooolinux 2018-02-12
  • 打赏
  • 举报
回复
@早打大打打核战争 实用程序是这样, 我现在只是用Indy写个demo程序,我想写这样的代码但是编译错误: TIdContext *AContext=(TIdContext *)IdTCPServer1->Contexts->Items[0]; 这个代码该怎么写?前提是没有在连接进来的时候保存AContext参数。
  • 打赏
  • 举报
回复
这是业务逻辑问题,你应该维护一个用户队列(可以自己写一个类,或者用TThreadList之类的),用户信息用结构或者类,每连接进一个用户,就增加一个队列成员,断开就删除一个,用户信息中有一项是context,队列有一个当前用户指针(索引),你选中的用户就是当前通讯用户,直接用他的context处理就可以了。
ooolinux 2018-02-11
  • 打赏
  • 举报
回复
可以用 TThread::Queue 静态方法代替 TIdNotify::NotifyMethod 。
ooolinux 2018-02-11
  • 打赏
  • 举报
回复
@早打大打打核战争 为什么在 try 和 except 里都要判断 if IdTCPClient1.Connected ?
  • 打赏
  • 举报
回复
并不知道,除非你在server断开之前通知它。 如果连接之后server端断开,客户端可以检测: try if IdTCPClient1.Connected then ... except if IdTCPClient1.Connected then ... end; 这个看起来有点奇怪,但是我发现还只能这样。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧