用sendstream,怎么用?客户端怎么处理?
用sendstream,怎么用?客户端怎么处理?
用sendstream,怎么用?客户端怎么处理?
用sendstream,怎么用?客户端怎么处理?
用sendstream,怎么用?客户端怎么处理?
解决方案 »
- 怎样直接从*.xls文件中直接读取数据,不要用ODBC和OLE等(急!!!解决就给分)分不够还可以再加!!!!
- DELPHI POST网页相关问题
- 是不是MDI类型的主form中不能放Timagelist啊?
- 用ADO连SQL SEVER数据库,出现“枚举器报告未指定错误。”何意??谢谢!
- 怎么知道某个MDIChild窗体是否已经存在?FindWindow不起作用。
- 关于操作excel2000的问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- delphi菜鸟问:最近新建一个工程,运行后,关掉时速度很慢?why?
- 关于AdoQuery问题
- 关于delphi中的xml mapper
- 怎么将gif图形转换成bmp图?
- 啊菜,怎么把一个图形成为一个可执行文件的资源文件!
- 我想建一个专门讨论delphi的新闻组
http://mental.top263.net/mentals/share/dev/msocket.htm
传过80几M的文件,没有问题,而且很快
标志 + 本次传送的字符数 + 文件内容 + 结束符 = 1024
1 2 n + 1
发送完后等待对方回应“OK”,再作下一批字符的发送。2、当另一程序接收到数据时,判断格式作处理。处理后发送回 “OK”。
3、直至文件传送完
哪里定义每次传1024个字节?
怎样控制本次传送的字符数为定长?用stream.read吗?
我还是有点困难,望各位点拨一下!
运行服务器端,再运行客户端,输入服务器端的ip地址建立连接
然后发一个字符通知服务器端,吧文件写入内存流,然后吧流发送给客户端
客户端接受的流后另存为文件
注意:
因为socket的限制,不能一次发送过大的数据,只能分几次发.
所以服务器端应先发送流的大小,通知客户端这个流共有多大
客户端根据这个数字来判断是否已经接受完毕.
内存流对象是程序设计中用的最普遍的,他可以提高I/O的读写能力.
因为时间限制,代码没经过调试,可能存在错误,但原理肯定没错!!!
下面是客户端接受数据的例子unit unit1 //客户端
......
var
form1:Tform1;
mysize:longint;
mystream:Tmemorystream;
implementation
{$R*.DFM}
procedure Tform1.formcreate(sender:Tobject);
begin
edit1.text:='127.0.0.1';
button1.caption:='连接';
button2.caption:='传输';
mystream:=Tmemorystream.create;//建立内存流对象
mysize:=0;//初始化
end;procedure Tform1.button1click(sender:Tobject);
begin
if not clientsocket1.active
then
begin
clientsocket1.address:=edit1.text;//远程IP地址
clientsocket1.port:=3000;
clientsocket1.open;//建立连接
end;
end;procedure Tform1.button2click(sender:Tobject);
begin
clientsocket1.socket.sendtext('FT');//发送指令通知服务器端传输文件
end;procedure Tform1.clientsocket1read(sender:Tobject;socket:tcustomwinsocket);
var
mybuffer:array[0..10000]of byte;//设置接受缓冲区
myrecevicelength:integer;
s:string;
begin
if mysize=0 then //mysize威服务器端发送的字节数,如果为零表示尚未开始发送
begin
s:=socket.receivetext;
mysize:=strtoint(s);//设置接受的字节数
clientsocket1.socket.sendtext('ready');//发送指令通知服务器端传输文件
end
else
begin //以下为接受数据部分
myrecevicelength:=socket.recevicelength;//读出包长度
socket.receivebuf(mybuffer,myrecevicelength);//接受数据报并读入缓冲区
mystream.write(mybuffer,myrecevicelength);//将数据写入流中
if mystream.size>=mysize then //如果流长度大于须接受的字节数,则接受完毕
begin
mystream.position:=0;
mystream.savetofile('filename');
mystream.clear;
mysize:=0'
end;
end;
end;procedure Tform1.formclose(sender:Tobject,var action:tcloseaction);
begin
mystream.free;
if clientsocket1.active then clientsocket1.close
end;end.
但是我最近看了些资料,发现xiaohuilau()所写,的确有道理,因为不自己写协议的话发送大文件时容易出错,
但我想知道用DeityFox(神狐)的方法发送多大一下的文件比较合适?
再没人就结帐了!别错过阿!
再没人就结帐了!别错过阿!
再没人就结帐了!别错过阿!
我分为8K,no problem
mybuffer:array[0..10000]of byte;//设置接受缓冲区
这就是每次发送流的大小