TCPClient用来连接到服务器,可以发送数据,但是,不能主动接收TCPServer发来的数据,只能自己发一条,然后立即收一条。
如果我用TCPServer,要广播一个消息,那客户端怎么接收啊?难道只能TCPClient主动发了命令后才能接收消息么?
请做过的朋友,给予解答。
如果有其他控件也可以提出来,但是不要说自己从头写一个,那样太费时间了。
我需要的是客户端和服务器端连接上以后都可以主动收发消息。
另外我客户端是在私网内的,所以请不要提出在客户端放一个服务端控件的想法,因为服务器不能连接到客户机的。只能由客户端去连接服务端。
5 个解决方案
#1
当然可以,通过Timer来处理ReadFromStack来评定是否有数据可读
研究过Indy In Depth和Indy的VCL源码就知道的
http://lysoft.7u7.net
研究过Indy In Depth和Indy的VCL源码就知道的
http://lysoft.7u7.net
#2
加个定时器定时检测
#3
那效率不是大打折扣?如果我的数据量居多,每秒很多包,普通的TIMER怎么处理的及?
莫非要用高级的多媒体定时器?
莫非要用高级的多媒体定时器?
#4
我觉得应该有一个时间通知啊。
还有一个问题,如果没有处理的包怎么办?丢掉么?我看了它有一个Timeout设置,那个是不是判断丢去包的时间?如果是,那么在Timeout时间没到之前,缓冲区被填满了怎么办?Indy Client设计的太不科学了吧。
高人来说说。。
还有一个问题,如果没有处理的包怎么办?丢掉么?我看了它有一个Timeout设置,那个是不是判断丢去包的时间?如果是,那么在Timeout时间没到之前,缓冲区被填满了怎么办?Indy Client设计的太不科学了吧。
高人来说说。。
#5
参考Indy例子Indy9Demos\Chat
procedure TfrmMain.BroadcastMessage( WhoFrom, TheMessage : String );
var
Count: Integer;
List : TList;
EMote,
Msg : String;
begin
Msg := Trim(TheMessage);
EMote := Trim(memEMotes.Lines.Values[Msg]);
if WhoFrom <> 'System' then
Msg := WhoFrom + ': ' + Msg;
if EMote <> '' then
Msg := Format(Trim(EMote), [WhoFrom]);
List := tcpServer.Threads.LockList;<-遍历所有以连接的客户端
try
for Count := 0 to List.Count -1 do
try
//发消息
TIdPeerThread(List.Items[Count]).Connection.WriteLn(Msg);
except
TIdPeerThread(List.Items[Count]).Stop;
end;
finally
tcpServer.Threads.UnlockList;
end;
end;
procedure TfrmMain.BroadcastMessage( WhoFrom, TheMessage : String );
var
Count: Integer;
List : TList;
EMote,
Msg : String;
begin
Msg := Trim(TheMessage);
EMote := Trim(memEMotes.Lines.Values[Msg]);
if WhoFrom <> 'System' then
Msg := WhoFrom + ': ' + Msg;
if EMote <> '' then
Msg := Format(Trim(EMote), [WhoFrom]);
List := tcpServer.Threads.LockList;<-遍历所有以连接的客户端
try
for Count := 0 to List.Count -1 do
try
//发消息
TIdPeerThread(List.Items[Count]).Connection.WriteLn(Msg);
except
TIdPeerThread(List.Items[Count]).Stop;
end;
finally
tcpServer.Threads.UnlockList;
end;
end;
#1
当然可以,通过Timer来处理ReadFromStack来评定是否有数据可读
研究过Indy In Depth和Indy的VCL源码就知道的
http://lysoft.7u7.net
研究过Indy In Depth和Indy的VCL源码就知道的
http://lysoft.7u7.net
#2
加个定时器定时检测
#3
那效率不是大打折扣?如果我的数据量居多,每秒很多包,普通的TIMER怎么处理的及?
莫非要用高级的多媒体定时器?
莫非要用高级的多媒体定时器?
#4
我觉得应该有一个时间通知啊。
还有一个问题,如果没有处理的包怎么办?丢掉么?我看了它有一个Timeout设置,那个是不是判断丢去包的时间?如果是,那么在Timeout时间没到之前,缓冲区被填满了怎么办?Indy Client设计的太不科学了吧。
高人来说说。。
还有一个问题,如果没有处理的包怎么办?丢掉么?我看了它有一个Timeout设置,那个是不是判断丢去包的时间?如果是,那么在Timeout时间没到之前,缓冲区被填满了怎么办?Indy Client设计的太不科学了吧。
高人来说说。。
#5
参考Indy例子Indy9Demos\Chat
procedure TfrmMain.BroadcastMessage( WhoFrom, TheMessage : String );
var
Count: Integer;
List : TList;
EMote,
Msg : String;
begin
Msg := Trim(TheMessage);
EMote := Trim(memEMotes.Lines.Values[Msg]);
if WhoFrom <> 'System' then
Msg := WhoFrom + ': ' + Msg;
if EMote <> '' then
Msg := Format(Trim(EMote), [WhoFrom]);
List := tcpServer.Threads.LockList;<-遍历所有以连接的客户端
try
for Count := 0 to List.Count -1 do
try
//发消息
TIdPeerThread(List.Items[Count]).Connection.WriteLn(Msg);
except
TIdPeerThread(List.Items[Count]).Stop;
end;
finally
tcpServer.Threads.UnlockList;
end;
end;
procedure TfrmMain.BroadcastMessage( WhoFrom, TheMessage : String );
var
Count: Integer;
List : TList;
EMote,
Msg : String;
begin
Msg := Trim(TheMessage);
EMote := Trim(memEMotes.Lines.Values[Msg]);
if WhoFrom <> 'System' then
Msg := WhoFrom + ': ' + Msg;
if EMote <> '' then
Msg := Format(Trim(EMote), [WhoFrom]);
List := tcpServer.Threads.LockList;<-遍历所有以连接的客户端
try
for Count := 0 to List.Count -1 do
try
//发消息
TIdPeerThread(List.Items[Count]).Connection.WriteLn(Msg);
except
TIdPeerThread(List.Items[Count]).Stop;
end;
finally
tcpServer.Threads.UnlockList;
end;
end;