TTcpServer控件是D7才加入的控件,Borland已经不建议用户使用旧的TClientSocket和TServerSocket了。
TTcpServer有三种模式bmBlocking/bmNonBlocking/bmThreadBlocking.
目前我是用bmThreadBlocking模式由TTcpServer自动为每个连接分配线程,但是问题在于当每个连接建立的时候TTcpServer的OnAccept事件会正常触发,在这个事件的内部也可以收发数据,但是只要这个事件返回,这个连接就会被释放了。这样每次在Client端发送数据都要重连一次。请问高手这是怎么回事,如何才能很好的控制TTcpServer。另外,两种模式我没试过,似乎和Windows Socket API使用很象,有哪位大哥知道的话,也希望能够不吝赐教。TTcpServer这方面的书实在太少了?Delphi自带的例子也太简单,刚好是连接,执行一次收发,然后结束,所以没有任何价值。
TTcpServer有三种模式bmBlocking/bmNonBlocking/bmThreadBlocking.
目前我是用bmThreadBlocking模式由TTcpServer自动为每个连接分配线程,但是问题在于当每个连接建立的时候TTcpServer的OnAccept事件会正常触发,在这个事件的内部也可以收发数据,但是只要这个事件返回,这个连接就会被释放了。这样每次在Client端发送数据都要重连一次。请问高手这是怎么回事,如何才能很好的控制TTcpServer。另外,两种模式我没试过,似乎和Windows Socket API使用很象,有哪位大哥知道的话,也希望能够不吝赐教。TTcpServer这方面的书实在太少了?Delphi自带的例子也太简单,刚好是连接,执行一次收发,然后结束,所以没有任何价值。
解决方案 »
- 求救,网络视频压缩+传输(有代码)
- 问一个备份SQL SERVER 数据库(5G多)出错问题~~~~~~~~~~~~~~~~~在线等待
- 我在listview里动态插入10000个item,插入的过程需要等待很长时间而且屏幕显示的半拉克机,就象死机一样!
- Delphi 数据库程序界面设计问题
- vcl内部如何按收自定义消息
- 使用teamsource时,经常会在开发机上产生拉级文件,并且一不小心就保存到备份机上面了,怎么样删除备份机上没用的文件?
- 打印问题(大哥们帮帮忙啊)
- 两台电脑上读取同一个U盘上同一扇区的数据会不一样,好奇怪??
- dcc70.dll 问题
- 菜鸟问题:为什么不能在窗体的Create事件中访问其他窗体的变量????
- 请问如何实现实时刷新??我调用了数据集的REFRESH,可没用啊??
- 〔200分〕Delphi 中如何用另外一个用户的身份来运行一人程序
必须用线程;
1. tcpclient从tcpserver接收数据: TReceiveThread = class(TThread)
private
FMsg: string;
protected
procedure Execute; override;
end;var
FThread: TReceiveThread;
procedure TReceiveThread.Execute;
begin
while not Terminated do
begin
if Form1.IdTCPClient1.Connected then
begin
FMsg := Form1.IdTCPClient1.ReadLn;
Sleep(100);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FThread := TReceiveThread.Create(False);
IdTCPClient1.Host := Edit1.Text;
IdTCPClient1.Port := 10001;
if not IdTCPClient1.Connected then
IdTCPClient1.Connect;
end;2. tcpserver向tcpclient发送数据
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
i : Integer;
AThread : TIdPeerThread;
begin
try
with IdTCPServer1.Threads.LockList do
for I := 0 to Count - 1 do
begin
AThread := Items[I];
if AThread.Connection.Socket.Binding.PeerIP = 'hostname' then
AThread.Connection.WriteLn(s);
end;
finally
IdTCPServer1.Threads.UnlockList;
end;
end;
放弃TTcpServer/TTcpClient 使用 TIdTcpServer 与 TIDTcpClient
关于TTcpServer的使用我也看了一下源代码,不过Borland带的也只是部分,只能从概念上理解。希望能看到更细致的描述和经验,我个人觉得这两个组件发挥的空间还是蛮大的,只是没有使用什么的经验。
已经说明了啊~
不过s端一定要用threadblocking~=========
稍微浏览过TTcpServer/TTcpClient的原代码, 发觉这好象是个未完工的东西, 作为自己写socket控件的基础类继承下来也许不错, 但是直接使用有很多问题, 反正borland推荐使用的是Indy.
=========瞎扯蛋~
两者只是用的SELECT I/O模式而已,而且写的很好~
对无需长连接,只要处理完毕数据即返回的请求,用这两组组件是效率最好的!
要其他I/O模式的可自己写~原来D6的Sokcet组件就是消息IO~想用自己添加近来就好(我想有很多人用api写可能还没它好~)扯远了~
正确做法是在OnGetThread接管线程自己实现数据请求
在ongetthread事件里面怎么下啊,
比如客户端发送了一个消息,我要转发给其它客户端怎么做啊?
我也最近有这个问题?
在ongetthread事件里面怎么下啊,
比如客户端发送了一个消息,我要转发给其它客户端怎么做啊?
這也是我一直想問的問題﹐有沒有高手講一下啊?