1.delphi的TClientSocket是不是基于TCP协议的?2.能否发送二进制数据?
type
TRec=packed record
i:integer;
c:char;
s:string;
b:boolean;
end;
var
rec:trec;
begin
rec.i:=0;
rec.b:=false;clientsocket.socket.sendbuffer(rec,sizeof(rec));
end;这样是否可以?是不是基于tcp协议的onclientwrite的激发条件是判断是否受到的字节数和事先发来的count比较才产生的?就是说sizeof(rec)的作用之一就是告诉接受方收到多少字节就算结束了?3.如果tcp协议是这样,那么udp呢?
使用udp协议接收信息的时候判断是否接受完毕的标准也是有个count?
唯一的不同就是udp协议接受信息的“无序性”?
type
TRec=packed record
i:integer;
c:char;
s:string;
b:boolean;
end;
var
rec:trec;
begin
rec.i:=0;
rec.b:=false;clientsocket.socket.sendbuffer(rec,sizeof(rec));
end;这样是否可以?是不是基于tcp协议的onclientwrite的激发条件是判断是否受到的字节数和事先发来的count比较才产生的?就是说sizeof(rec)的作用之一就是告诉接受方收到多少字节就算结束了?3.如果tcp协议是这样,那么udp呢?
使用udp协议接收信息的时候判断是否接受完毕的标准也是有个count?
唯一的不同就是udp协议接受信息的“无序性”?
procedure TFM_DL_CLT.cstCLTRead(Sender: TObject; Socket: TCustomWinSocket);
var
pvbuf: Pointer;
isize,irealsize: Integer;
sTemp: String;
begin
try
isize := Socket.ReceiveLength;
GetMem(pvbuf, isize);
0A irealsize := Socket.ReceiveBuf(pvbuf^,isize);
sTemp := PChar(pvbuf);
sTemp := Copy(Trim(sTemp),1,irealsize);
if (sTemp = 'AskForFilePathName') then
begin
Socket.SendText(RemoteFilePathName);
end else if (sTemp = 'FileNameGot') then
begin
Socket.SendText('AskForFileLength');
end else if (Copy(sTemp,1,6) = 'Length') then
begin
FileLength := StrToInt(Copy(sTemp,7,Length(sTemp)-6));
prgRate := ggCopy.MaxValue / FileLength;
Socket.SendText('AskForFile');
end else if (sTemp = 'End') then
begin
cstCLT.Close;
FreeAndNil(DSFile);
0A lbNote.Caption := '下载完毕,更新文件吗?';
ggCopy.Progress := ggCopy.MaxValue;
btCommit.Visible := true;
btCancel.Visible := true;
end else
begin
Socket.SendText('AskForFile');
Inc(FileLengthCurr,DSFile.Write(pvbuf^,irealsize));
ggCopy.Progress := Round(prgRate * FileLengthCurr);
{if (FileLengthCurr >= FileLength) then //理论上可行
begin
FreeAndNil(DSFile);
cstCLT.Close;
lbNote.Caption := '下载完毕,更新文件吗?';
btCommit.Visible := true;
btCancel.Visible := true;
end;}
end;
finally
FreeMem(pvbuf);
end;
end;她的读写事件和服务端是否多线程运行有关系。
—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
I := TI.Create(Nil);
I.Maxim := MaximStr;
I.Explain := '假如上述代码中出现“OA”等字样,删除它们';
I.Desire := '加不加分随你';
—————————————————————————————————
那么另外两个问题呢?
type
TREC=packed record
i:integer;
d:double;
c:char;
end;
var
l:integer;
p:pointer;
rec:trec;
begin
getmem(p,sizeof(rec));
l:=client1.socket.receivelength;
showmessage('');client1.socket.recievebuffer(p,l);
...
freemem(p);
end;
//为什么加上showmessage会出错呢?
type
TREC=packed record
i:integer;
d:double;
c:char;
end;
var
l:integer;
p:pointer;
rec:trec;
begin
getmem(p,sizeof(rec));
l:=client1.socket.receivelength;
showmessage('');client1.socket.recievebuffer(p,l);
...
freemem(p);
end;
//为什么加上showmessage会出错呢?
u can't use showmessage!