200分-------------------求多线程问题,帮看下代码 (代码很整洁的,担保不会累眼) ( 积分: 200 )

  • 主题发起人 主题发起人 su820127
  • 开始时间 开始时间
S

su820127

Unregistered / Unconfirmed
GUEST, unregistred user!
注:因本人认识浅溥,第一次发错题,现改正一下贴上代码,各位富哥富姐不要介意
想做一程序,里面有两个IdTcpClient,如何使用多线程的方法,让这两个IdTcpClient能够同时接收和发送信息,?,看过一些线程同步的文章,未能消化,
各位D哥D姐,最好能给个范例代码....^_^...马上送出200分
 
楼主看这个例子吧:
http://www.2ccc.com/article.asp?articleid=3894
 
盒子那个,已看过了,他并不是indy的多线程阿,发文件时就不能发聊天信息了
 
Indy的Server就是多线程的。你所要实现的是并发逻辑,那和Indy无关,只是你自己要去重新分包发送每个文件块,然后在连续的文件块包中,间杂发送你的消息块包。这是你的实现问题而已。至于TCPClient和TCPServer的使用,那个例子已经给你完整的演示了。
 
不是阿,我见到别的程序。。主连接可以用于正常聊天发信息。。。在发文件的时候防火墙里显示多了一个连接。。但使用端口是跟主连接的端口一样的,,发完文件后,那个连接就关闭了。。。。这种方式,该怎么实现阿?
 
>>自己要去重新分包发送每个文件块,然后在连续的文件块包中,间杂发送你的消息块包
我不是解释了你说的问题的原理了吗?就是把单纯的文件流发送改成分包发送,在发文件包的同时,又可以发文本包,接收端通过判断包头部的某个byte来识别包的类别,文件的按照文件方式拼装起来,文字的显示到界面上。就这么简单。
 
楼主的思路有误了。
indy本来就是多线程的,server会为每一个连接到他的客户端创建一个独立的线程运行..
你在服务端摆上一个idtcpserver,在客户端摆上两个idtcpclient控件,client1用于发送信息到你的服务端,,独收到文件传输信息后,启动client2连接到服务端,并发送文件..
这是你想要的结果吧。
 
大家帮忙看看这个代码怎么改才能,同时接收信息:
program Client;
{$APPTYPE CONSOLE}
uses
SysUtils,Windows,shellapi,Classes,IdTCPClient;
type //线程一
Thread_one = class(TThread)
protected
procedure Execute;
override;
Public
constructor Create;
destructor Destroy;
override;
end;
type //线程二
Thread_two = class(TThread)
protected
procedure Execute;
override;
Public
constructor Create;
end;
var
ClientThread1: Thread_one;
IdTCPClient1 :TIdTCPClient;
ScClient :TIdTCPClient;
ClientThread2 :Thread_two;
{----------------创建线程-----------------------}
constructor Thread_one.Create;
begin
inherited Create(True);
FreeOnTerminate:=True;
end;
constructor Thread_two.Create;
begin
inherited Create(True);
FreeOnTerminate:=false;
end;
{----------------连接服务端---------------------}
function GoServer(BThread: TIdTCPClient;
ip:string):Boolean;
begin
try
if BThread.Connected then
BThread.Disconnect;
BThread.Host:=ip;
BThread.Port:=5353;
BThread.Connect;
Result:=True;
except
Result:=False;
end;
end;
{----------------接收服务端二的数据---------------------}
procedure Thread_two.Execute;
var
Str:String;
begin
Synchronize(Execute);
while not Terminateddo
begin
try
Str:=ScClient.IOHandler.ReadLn();
except
ClientThread2.Destroy;
end;
end;
end;
{----------------接收服务端一的数据----------------------}
procedure Thread_one.Execute;
var
Str:String;
begin
while not Terminateddo
begin
try
Str:=IdTCPClient1.IOHandler.ReadLn();
except
ClientThread1.Destroy;
end;
end;
end;
{----------------------------------------}
procedure MainConnect2;
//连接服务端二
begin
ScClient :=TIdTCPClient.Create(nil);
try
while not ScClient.Connecteddo
begin
if GoServer(ScClient,'192.168.0.3') then
ClientThread2:=Thread_two.Create;
end;
except
ScClient.Free ;
exit;
end;
end;
procedure MainConnect;
//连接服务端一
begin
IdTCPClient1 :=TIdTCPClient.Create(nil);
try
while not IdTCPClient1.Connecteddo
begin
if GoServer(IdTCPClient1,'192.168.0.5') then
begin
if not IdTCPClient1.Connected then
exit;
SendToClient(IdTCPClient1,'comeon');
ClientThread1:=Thread_one.Create;
end;
sleep(5500);
end;
ClientThread1.Execute;
except
IdTCPClient1.Free ;
exit;
end;
end;
destructor Thread_one.Destroy;
begin
MainConnect;
MainConnect2
end.
 
白问的。。。自已买书去,结贴,进者有分
 
多人接受答案了。
 
后退
顶部