怎样使用ServerSocket和ClientSocket控件传输比较大的数据流?

Fairton 2000-06-29 09:02:00
在这两个控件的OnRead事件中只能读8K字节的数据;如果一次传送比较大{>8K Bytes}的数据流,接收时将变成几个小数据包;请问有没有标准的办法传送较大的数据包

多谢!
...全文
336 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fairton 2000-07-11
  • 打赏
  • 举报
回复
目前已经决定采用统一的数据包传输格式来处理这个问题;
处理方法是这样的:
每个数据包都用前4个字节(4*8)代表的Longint表示数据区大小,接下来用几个固定参数(比如10个)来标志数据包属性,然后是数据区。

接收程序需要定义全局性的(相对接收程序来说)接收缓冲区,每一次ClientSocket的OnRead事件接收的数据依次写入接收缓冲区中,然后判断缓冲区是否为一个完整数据包,如果是完整数据包则进行相应处理,然后清空该缓冲区;即接收数据包操作是一样的,数据包处理放在接收程序的另一块,不放在OnRead事件代码内部

XiXi,50分我自己拿回去了
Fairton 2000-07-11
  • 打赏
  • 举报
回复
如果能接收到TransfSize标志的数据,在接收程序中可以将连续几个数据包合并在一起。但是,我问的不是点对点直接通讯的问题,而是Server端对多Client发送数据包,每个Client采用两个ClientSocket好象不实际;而且多个数据包的连续传送也需要处理同步问题。
我的想法是同一个Socket连接可以传输命令以及数据流;
设想的做法有几个
1、在发送端将数据流分成小数据包再传送(将包格式信息存放在固定位置,象汇编语法)
2、设置端口的状态信息,初始状态为‘读命令’状态;当命令为接收‘长度为X的数据流’时修改为‘读数据’状态;读数据到X长度时终止‘读数据’状态,返回‘读命令’状态

您回答的是点对点的通讯,而我需要的是大范围多点的大数据包传输处理方式,至少需要思想;现在不能给分,Sorry
alin 2000-06-30
  • 打赏
  • 举报
回复
用两个TServerSocket,一个用来作通信命令处理,一个专门用来传数据,
用Server的数据传输用的TServerSocket使用Thred Socket;
下例是传送一个文件,在10M网内200KB大约一秒多种
procedure TfrmMain.ServerSock_DataGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread := TScreenServerThread.Create(False, ClientSocket);
end;

procedure TScreenServerThread.ClientExecute;
var
FName : string;
begin
while not Terminated and ClientSocket.Connected do
try
if ClientSocket.Connected then
begin
FName := TempPath + 'temp.wav';
if FileExists(FName) then
ClientSocket.SendStream(TFileStream.Create(FName,
fmOpenRead or fmShareCompat or fmShareDenyNone));
ClientSocket.Close;
end;
end;
except
end;
end;


接收方ReceiveMem为TMoneyStream;ClientSocket.Open就可以了

procedure Tfrm_MasterWindow.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
Temp : string;
begin
Temp := Socket.ReceiveText;
ReceiveMem.Write(PChar(Temp)^, Length(Temp));
end;

procedure Tfrm_MasterWindow.ClientSocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
FileSt : string;
begin
//TransfSize由通信方先得到
if TransfSize <> ReceiveMem.Size then Exit;
FileSt := Format('%s.jpg',[Socket.RemoteAddress]);
ReceiveMem.SaveToFile(FileSt);
end;

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧