Delphi中文件传输有几句赋值语句的困惑

type
TDataFlag = Record
FileName : String;
FileSize : Integer;
WorkFlag : Integer;
end;
PDataFlag = ^TDataFlag;

。。。

procedure TFrmServerFile.SServerClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
DataF:PDataFlag;
begin
DataF := New(pDataFlag);
Dataf.FileName:=''; socket.data
Dataf.FileSize:=0;
DataF.WorkFlag:=0;
Socket.Data:=Dataf;
socket.SendText('已经连接好,准备传输文件!'#13#10);
end;
procedure TFrmServerFile.SServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
Buf:array[0..buffersize] of char;
NumberBytes:integer;
cmd:string;
dataf:PDataFlag;

begin
dataf:=Socket.Data;
Case dataf.WorkFlag of
0:
begin
cmd := Trim(Socket.ReceiveText);
if pos('SendFileinfo',cmd) > 0 then
begin
DataF.FileName:=Trim(Copy(CMD,pos(';',cmd)+1,Length(cmd)));
Dataf.FileSize:=StrToInt(Copy(Dataf.FileName,pos(';',Dataf.FileName)+1,Length(dataf.FileName)));
DataF.FileName:=Trim(copy(Dataf.FileName,0,pos(';',dataf.FileName)-1));
Dataf.WorkFlag:=1;
socket.Data:=Dataf;
mmStatus.Lines.Add('文件名:'+dataf.FileName+'文件大小:'+inttostr(Dataf.FileSize));
userhost :=Socket.RemoteHost;
end;
end;
1:
begin
if Trancing then
begin
begin
NumberBytes:= socket.ReceiveLength;
socket.ReceiveBuf(buf,NumberBytes);
MemoStream.Write(buf,numberBytes);
if numberbytes >= BufferSize then
begin
socket.SendText('FiletransferWork');
mmstatus.Lines.Add(inttostr(NumberBytes));
end;
if numberbytes < BufferSize then
begin
socket.Sendtext('FileTransferStop');
MemoStream.Position:=0;
try
mmstatus.Lines.Add('来自:'+Socket.RemoteHost+ '的文件传送完毕!');
Trancing:=false;
Dataf.WorkFlag:=0;
socket.Data:=Dataf;
MemoStream.savetofile(DataF.filename); //保存文件
except
showmessage('在保存文件时出现错误!');
exit;
end;
Memostream.clear;
end;
end;
end;
end;
end;
end;

主要困惑的是: Socket.Data:=Dataf; dataf:=Socket.Data; socket.Data:=Dataf; socket.Data:=Dataf; 这几句赋值语句我感觉好像都是一回事,但去掉一句程序就出错。我看来看去,也看不出什么名堂。这几句赋值语句到底是在干什么,一会赋值来,一会又赋值去的,直接进行操作不行吗,实在不懂。请给位Delphi的高手指点下。先谢谢了

Delphi的Socket文件传输也曾经让我困惑了一阵子,后来经过深入研究,终于彻底明白了其中奥秘。 这些相关问题,不是三言两语能说清楚的。我这里可以告诉你几条:

1、ServerSocket,只要是使用默认的“非阻塞”方式,则其内部是自动采用多线程方式工作的。
2、Socket.Data属性:它是一个指针,可以指向任何类型的数据,通常这些数据包含了与客户端Socket相关的一些信息。 保存客户端Socket的相关信息,其目的是为了在服务端区分出各个客户端Socket,这一点至关重要!

-------------------------------------------------

无需将FileName : String; 改成 FileName : String[100];
使用string 类型毫无问题。
看看我以前写的:
type
TSocketData = record
xh: string;
ip: string; //客户端计算机IP地址
StartReceive: Boolean; //标记开始从客户端接收"考生文件夹.rar"文件
ReceiveFileSize: integer; //接收的考试结果"考生文件夹.rar"的大小
Fs_Result: TFileStream; //接收文件流
Fs_TestFilePosition: int64; //流Fs_Test的读取位置
end;
PSocketData = ^TSocketData;
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-07-20
Socket.Data:=Dataf; //传输的时候指定将要传输的数据来自于dataf
dataf:=Socket.Data; //接收的时候指定从socket中读取dataf

不过我觉得TDataFlag的定义将会导致读取不正确的情况
应该要类似如下定义,才可正确收发头信息
type
TDataFlag = Record
FileName : String[100];
FileSize : Integer;
WorkFlag : Integer;
end;
PDataFlag = ^TDataFlag;
第2个回答  2010-07-20
Dataf在几个语句间已经经过各种条件对属性进行了修改,之前赋值和改属性后赋值当然不一样

Delphi中文件传输有几句赋值语句的困惑
1、ServerSocket,只要是使用默认的“非阻塞”方式,则其内部是自动采用多线程方式工作的。2、Socket.Data属性:它是一个指针,可以指向任何类型的数据,通常这些数据包含了与客户端Socket相关的一些信息。 保存客户端Socket的相关信息,其目的是为了在服务端区分出各个客户端Socket,这一点至关重要!--- ...

delphi用SQL语句插入数据,在给参数赋值时出错,没有异常就跳出。_百度...
Add(')value('); 这句有错 Values前后应有空格,而且英文错误少了个s Add(') Values (')

DELPHI中对DBGRID列求和赋值到文本框问题
把你要合计的字段比如 sum 声明为TAggregateField。这个做法跟添加计算字段差多,只是你添加字段时选择Aggregate。TAggregateField详细你可以参考http:\/\/hi.baidu.com\/davidjkl\/item\/54435f0edf26ecdf73e67663。主要就是ClientDataSet的DefaultExpression要设,如sum(field_money),字段Active属性设置为True,数据...

Delphi的一个问题?
在Delphi编程中,当你需要加载一个图片到一个指定的组件上时,可能会遇到类似的问题。正确的语句应该是使用Image.picture.LoadFromFile('d:\\mm.bmp'),而不是Image1.picture:=LoadFromFile('d:\\mm.bmp')。这里的关键在于,Delphi的GUI组件,如Image,是需要通过引用的方式来处理数据的,而不是直接赋值。

delphi中 =和 :=有什么区别
=是关系运算符,表示关系的判断:=是赋值运算,将右边的表达式的值赋给左边的变量,右边只能是变量

DELPHI IF 语句的问题,我把下边的ELSE去掉程序效果还和原来一样么,另外...
可以去掉else,不影响上面程序的结果。前面的result:=0是为了给一个函数的初始值,这样如果你传入的srootkey如果不是下面的内容之一,返回的值也会是0,通过这个返回值就可以判断strtokey是不是取到的需要的结果,然后再做后面的处理。

delphi,程序没有报错,但是把鼠标放在某个参数上,出现提示,都是写着inac...
有很多参数都是无法跟踪的,比如一个类里的参数,你要想调试需要转到那个类的代码中去才能看到相应的值,另外你可以设置一些条件比如在一个循环中你要调试的话到死也未必找到出错的地方,这个时候要猜测哪里错误,然后设置一个变量用if语句写一个条件然后把断点放在if之后那个赋值的变量上就有可能轻易的...

delphi中 2:sch.stopper:=st1什么意思
从 2:sch.stopper := st1 推测看:1、由 2: 估计是 delphi 中的多分支语句 case 的一部分。2、:= 在 delphi 语法中,是赋值语句。综上,推测意思大致如下:如果值等于 2 的情况下,将 st1 赋值给 sch.stopper 。

请教一个关于VBA编程问题.
在VBA编程中,赋值语句是基本操作之一,通常使用等号(=)来完成。然而,有时候只写一个等号可能会引起语法错误或行为不一致。这是因为等号除了代表赋值操作,还可能在某些上下文中被当作比较操作符。因此,在特定语境下,使用两个等号(:=)是正确的语法。例如,在Delphi编程语言中,赋值语句也是采用:=...

Delphi 中怎样写选择语句
首先,当出现“语句中含有非法字符”的错误提示时,需要检查你的源代码以及数据库表名和字段名。Delphi并不支持中文字符,因此表名、字段名等必须使用英文。如果在赋值操作中使用了中文字符,应当使用单引号将中文字符括起,确保语句的合法性。在Delphi中,符号的使用应当遵循半角字符的标准,例如英文的单...

相似回答
大家正在搜