使用Idtcpserver 做服务器,客户端自动连接5010端口。
想实现:
1、发送(1,sysinfo),当接收到的数据里包含sysinfo时取出机器的序列号
2、点开始下载的时候发送下载指令,接收到有返回数据时,下载文件。 根据返回的数据算出发送文件的块号 每一块512个字节只连接一台机器的时候程序没问题,现在想改成多台连接一起下载,线程的问题搞不清楚:
OnConnect事件:
var
NewClient : pClient;
begin
GetMem(NewClient,SizeOf(TClient)); NewClient.ClientIP := AThread.Connection.Socket.Binding.PeerIP;
NewClient.FileID := 0;
NewClient.Kuaihao := 0;
NewClient.Thread := AThread;
Sleep(100);
AThread.Connection.WriteLn('(1,sysinfo)');
AThread.Data := TObject(NewClient);
try
Clients.LockList.Add(NewClient);
finally
Clients.UnlockList;
end;
SB.Panels[1].Text :='服务已启动';
CbbLanguage.Enabled := False;
BtnBegin.Enabled := True;
BtnCancle.Enabled := True;
end;
SendFile:
var
i : integer;
SFile, CurIP : String;
RecClient : pClient;
CommBlock : TCommBlock;
CurThread : TIdPeerThread;
PMark : Array[0..4] of byte;
begin
SendMark := False;
SFile := EdtFile.Text + IntToStr(FileID) + '.VOI';
if not FileExists(SFile) then Exit;
Fs := TFileStream.Create(SFile,fmOpenRead or fmShareDenyNone);
PSize := Fs.Size div 512 ;
if (Fs.Size mod 512) <> 0 then Inc(pSize);
PMark[0] := $40;
PMark[1] := PageBegin div 256;
PMark[2] := PageBegin mod 256;
PMark[3] := pSize div 256;
PMark[4] := pSize mod 256;
with Clients.LockList do
begin
for i:=0 to count-1 do
begin
RecClient := Items[i];
CurIP := RecClient.ClientIP;
if CurIP = CommBlock.RecIP then
begin
CurThread := RecClient.Thread;
CurThread.Connection.WriteBuffer(pMark,sizeof(p)); //'400C000005'
end;
end;
end;
end;
OnExecute事件:
var
ActClient, RecClient : PClient;
Buffsize, i, CurKuai : integer;
GetID, sStr, CurIP : String;
SMark : Array[0..3] of Byte;
sReadByte : Array[0..9] of Byte;
pbuf : Array[0..511] of Byte;
Curthread: TIdPeerThread;
begin
if not AThread.Terminated and AThread.Connection.Connected then
begin
with Clients.LockList do
begin
for i:=0 to Count-1 do
begin
Buffsize := AThread.Connection.ReadFromStack(True,-1,true);
ActClient := PClient(AThread.Data);
ActClient.FileID := CurFileID;
CommBlock.RecIP := AThread.Connection.Socket.Binding.PeerIP; RecClient := Items[i];
CurIP := RecClient.ClientIP;
if CurIP = CommBlock.RecIP then
begin
if Buffsize > 10 then
begin
sStr := Athread.Connection.ReadLn;
if Pos('sysinfo',sStr) > 0 then
begin
GetID := Copy(sStr,2,8);
Memo1.Items.Add('ID:'''+GetID+'''Successed Link!');
CurFileID := 0;
SendFile(CurFileID);
Sleep(150);
end;
end
else if Buffsize = 2 then
begin
//CurThread := RecClient.Thread;
AThread.Connection.ReadBuffer(sReadByte,SizeOf(sReadByte));
if not((sReadByte[0]= $28) and (sReadByte[1]= $29)) then
begin
sleep(200);
if SendMark then
begin
SendMark := False;
Fs.Destroy;
sMark[0] := $23; //#
sMark[1] := CurFileID; //音频文件序号
sMark[2] := (PageBegin-pSize+1) div 256; //文件起始地址
sMark[3] := (PageBegin-pSize+1) Mod 256;
Curthread := Recclient.Thread;
Curthread.Connection.WriteBuffer(sMark,SizeOf(sMark)); //'#+文件号+起始地址'
PBinfo.Progress := 0;
PBinfo.MaxValue := 26;
PBinfo.Progress := PBinfo.Progress + CurFileId;
SB.Panels[1].Text := '下载'+IntToStr(CurFileId)+'.VOI文件成功!';
Inc(CurFileID);
SendFile(CurFileID);
Inc(PageBegin);
end
else begin
CurKuai := sReadByte[0]*256+sReadByte[1];
if (Fs.Size-(CurKuai*512)) > 512 then
begin
Fs.Seek(CurKuai*512,soFromBeginning);
Fs.ReadBuffer(pBuf,512);
CurThread := RecClient.Thread;
CurThread.Connection.WriteBuffer(pBuf,512);
Inc(PageBegin);
end
else if (Fs.Size-(CurKuai*512)) = 512 then
begin
Fs.Seek(CurKuai*512,soFromBeginning);
Fs.ReadBuffer(pBuf,512);
CurThread := RecClient.Thread;
CurThread.Connection.WriteBuffer(pBuf,512);
SendMark := True;
end
else if (Fs.Size-(CurKuai*512)) = 512 then
begin
Fs.Seek(CurKuai*512,soFromBeginning);
Fs.ReadBuffer(pBuf,512);
CurThread := RecClient.Thread;
CurThread.Connection.WriteBuffer(pBuf,512);
SendMark := True;
end;
end;//文件是否发送完成 _end
end;//收到的数据不包含括号的处理_end
end; // 返回数据大小判断的处理 _end
end; //当前IP=接收IP_end
end; //连接几个客户端 for循环_end
end; //with _end
end; //线程连接上了_end
end;
想实现:
1、发送(1,sysinfo),当接收到的数据里包含sysinfo时取出机器的序列号
2、点开始下载的时候发送下载指令,接收到有返回数据时,下载文件。 根据返回的数据算出发送文件的块号 每一块512个字节只连接一台机器的时候程序没问题,现在想改成多台连接一起下载,线程的问题搞不清楚:
OnConnect事件:
var
NewClient : pClient;
begin
GetMem(NewClient,SizeOf(TClient)); NewClient.ClientIP := AThread.Connection.Socket.Binding.PeerIP;
NewClient.FileID := 0;
NewClient.Kuaihao := 0;
NewClient.Thread := AThread;
Sleep(100);
AThread.Connection.WriteLn('(1,sysinfo)');
AThread.Data := TObject(NewClient);
try
Clients.LockList.Add(NewClient);
finally
Clients.UnlockList;
end;
SB.Panels[1].Text :='服务已启动';
CbbLanguage.Enabled := False;
BtnBegin.Enabled := True;
BtnCancle.Enabled := True;
end;
SendFile:
var
i : integer;
SFile, CurIP : String;
RecClient : pClient;
CommBlock : TCommBlock;
CurThread : TIdPeerThread;
PMark : Array[0..4] of byte;
begin
SendMark := False;
SFile := EdtFile.Text + IntToStr(FileID) + '.VOI';
if not FileExists(SFile) then Exit;
Fs := TFileStream.Create(SFile,fmOpenRead or fmShareDenyNone);
PSize := Fs.Size div 512 ;
if (Fs.Size mod 512) <> 0 then Inc(pSize);
PMark[0] := $40;
PMark[1] := PageBegin div 256;
PMark[2] := PageBegin mod 256;
PMark[3] := pSize div 256;
PMark[4] := pSize mod 256;
with Clients.LockList do
begin
for i:=0 to count-1 do
begin
RecClient := Items[i];
CurIP := RecClient.ClientIP;
if CurIP = CommBlock.RecIP then
begin
CurThread := RecClient.Thread;
CurThread.Connection.WriteBuffer(pMark,sizeof(p)); //'400C000005'
end;
end;
end;
end;
OnExecute事件:
var
ActClient, RecClient : PClient;
Buffsize, i, CurKuai : integer;
GetID, sStr, CurIP : String;
SMark : Array[0..3] of Byte;
sReadByte : Array[0..9] of Byte;
pbuf : Array[0..511] of Byte;
Curthread: TIdPeerThread;
begin
if not AThread.Terminated and AThread.Connection.Connected then
begin
with Clients.LockList do
begin
for i:=0 to Count-1 do
begin
Buffsize := AThread.Connection.ReadFromStack(True,-1,true);
ActClient := PClient(AThread.Data);
ActClient.FileID := CurFileID;
CommBlock.RecIP := AThread.Connection.Socket.Binding.PeerIP; RecClient := Items[i];
CurIP := RecClient.ClientIP;
if CurIP = CommBlock.RecIP then
begin
if Buffsize > 10 then
begin
sStr := Athread.Connection.ReadLn;
if Pos('sysinfo',sStr) > 0 then
begin
GetID := Copy(sStr,2,8);
Memo1.Items.Add('ID:'''+GetID+'''Successed Link!');
CurFileID := 0;
SendFile(CurFileID);
Sleep(150);
end;
end
else if Buffsize = 2 then
begin
//CurThread := RecClient.Thread;
AThread.Connection.ReadBuffer(sReadByte,SizeOf(sReadByte));
if not((sReadByte[0]= $28) and (sReadByte[1]= $29)) then
begin
sleep(200);
if SendMark then
begin
SendMark := False;
Fs.Destroy;
sMark[0] := $23; //#
sMark[1] := CurFileID; //音频文件序号
sMark[2] := (PageBegin-pSize+1) div 256; //文件起始地址
sMark[3] := (PageBegin-pSize+1) Mod 256;
Curthread := Recclient.Thread;
Curthread.Connection.WriteBuffer(sMark,SizeOf(sMark)); //'#+文件号+起始地址'
PBinfo.Progress := 0;
PBinfo.MaxValue := 26;
PBinfo.Progress := PBinfo.Progress + CurFileId;
SB.Panels[1].Text := '下载'+IntToStr(CurFileId)+'.VOI文件成功!';
Inc(CurFileID);
SendFile(CurFileID);
Inc(PageBegin);
end
else begin
CurKuai := sReadByte[0]*256+sReadByte[1];
if (Fs.Size-(CurKuai*512)) > 512 then
begin
Fs.Seek(CurKuai*512,soFromBeginning);
Fs.ReadBuffer(pBuf,512);
CurThread := RecClient.Thread;
CurThread.Connection.WriteBuffer(pBuf,512);
Inc(PageBegin);
end
else if (Fs.Size-(CurKuai*512)) = 512 then
begin
Fs.Seek(CurKuai*512,soFromBeginning);
Fs.ReadBuffer(pBuf,512);
CurThread := RecClient.Thread;
CurThread.Connection.WriteBuffer(pBuf,512);
SendMark := True;
end
else if (Fs.Size-(CurKuai*512)) = 512 then
begin
Fs.Seek(CurKuai*512,soFromBeginning);
Fs.ReadBuffer(pBuf,512);
CurThread := RecClient.Thread;
CurThread.Connection.WriteBuffer(pBuf,512);
SendMark := True;
end;
end;//文件是否发送完成 _end
end;//收到的数据不包含括号的处理_end
end; // 返回数据大小判断的处理 _end
end; //当前IP=接收IP_end
end; //连接几个客户端 for循环_end
end; //with _end
end; //线程连接上了_end
end;
还Lock什么List?!