请问一个比较笼统的问题:用Socket怎样保证客户端收到的服务器的数据的一致性和完整性?即同步的问题。(100分)

  • 主题发起人 主题发起人 xoenice
  • 开始时间 开始时间
X

xoenice

Unregistered / Unconfirmed
GUEST, unregistred user!
当服务器连续朝客户端发送数据时,客户端收到的数据长度不能与服务器发送的长度相等,怎样保证客户端的数据同步呢?
 
真是够笼统了,
一致,完整,同步,都是很笼统词语,

Socket底层已经实现了你说的要求了
但是它是基于数据流的,
 
比如我从服务器端连续地发出64个字节的char数组,而客户端每次收到的数级字节数可能是128字节而不是64个字节!
 
怎么没有人回答呢?
 
根据应用的需要,客户端和服务端还得定一个协议,
例如,定长的,每次发多少字节,或不定长的,用约定的开始
结束标志,或开头指定长度,还要做差错控制...
 
怎么发的代码贴出来看看
 
----------------------------
怎么发的代码贴出来看看
----------------------------
你已经可以发几个64bytes了,已经很接近目标了,我当初一个也发不了
代码? 要看怎么用,Delphi Chat就是一个例子,
它用ReceiveText,SendText,那是基于字符串的,是用Null作为结束符

至于差错控制流程控制,Delphi Chat的例子没有,其实很多的应用都需要,
收发两头,就跟两个人说话,不能老是一个人说. 要一人一句,否则就跟吵架
似的. 即使是一个人在训斥另一个,被训的也要说"知道了","对"
 
每次发的包不要太大,不要超过4K,采用Tcp/IP协议,不容易丢失数据。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2140578
 
这是正常的,因为TCP/ip是基于流的连接,
数据流和数据包是两种方式,

你可以在数据流中插入包起始或结束标记,
扫描数据,取出每个数据包就可以了
 
而且服务器和客户端之间的通讯只能维持一段时间。这是为什么呢,下面是我的程序;
当客户端向服务器端发出请求后,服务器就持续不断的向客户端发送数据。
客户端的TClientSocket的ClientType属性为ctBlocking
服务器端的TServerSocket的ServerType属性为stThreadBlocking
写入它的OnGetThread事件

服务器端自定义线程TServerthread
TServerthread = class(TServerClientThread) ;
其中的ClientExcute过程为
procedure TServerThread.ClientExcute
begin
while ((not Terminated) and ClientSocket.Connected) do
begin
try
Synchronize(Send);
except
HandleException;
end;
end;
end;
其中Send函数如下
procedure Send;
var
i,:integer;
Server_Send:Array [0..1399] of char;
begin
for i:=0 to 1399 do
Server_Recv:=char($0A);
len:=ClientSocket.SendBuf(Server_Recv,1400);
end;

客户端用一个线程来接收服务器发送的数据;
线程执行过程为
procedure TRealRec.Execute;
begin
repeat
Synchronize(ReFresh);
until Terminated;
end;
其中ReFresh过程为
procedure ReFresh;
var
buffer: array [0..9] of char;
Client_Recv:Array [0..65535] of char;
TheStream:TWinSocketStream;
begin
TheStream := TWinSocketStream.Create(Form_Main.Client.Socket, 3000);
try
if Form_Main.Client.Active then
begin
if TheStream.WaitForData(3000) then
TheStream.Write(buffer, Length(buffer) + 1);
if TheStream.WaitForData(60000) then
try
begin
len:=TheStream.Read(Form_Main.Client_Recv,Length(Client_Recv));
if len<=0 then
begin
Form_Main.Client.Close;
//Exit;
end
else
Form_Main.Memo1.Lines.Add(inttostr(len));
end;
except Form_Main.Client.Close;
end;
end;
finally
TheStream.Free;
end;
end;
 
各位帮我看看啊!
 
后退
顶部