导航
  • 主页
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API
  • 问答

我用Tclientsocket实现了文件的发送,本来可以找mm聊天去了,后来发现。。。

chenjbjbjb 2002-04-04 11:34:47
发一个8M的文件用了45秒,平均每秒还不到200K,我真是郁闷了,tcp连接、
局域网,怎么会是这个速度,我想可能是代码有问题,就去查
发送方:
loop until data not over
GetMem(bufSend,MaxDateLength);//开辟buffer
MemoryStream.Read(bufSend^,MaxDateLength);//从MemoryStream中读取MaxDateLength个字节,MemoryStream存放了文件内容
ClientSocket.SendBuf(bufSend^,ActBytes);//发送
FreeMem(bufSend,MaxDateLength);//释放buffer
end;//end loop
接收方:
使用了WinSocketStream
loop until data not over
Stream := TWinSocketStream.Create(ClientSocket.Socket,8000);
Try
if Stream.WaitForData(8000) then
begin
GetMem(Bytes,MaxDateLength);//开辟buffer
I := Stream.Read(Bytes^,MaxDateLength);
fsData.Write(Bytes^,I);//写入文件流
FreeMem(Bytes);//释放buffer
。。。
Stream.free
end;//end loop
看了半天也没觉得有什么不对,难道MaxDateLength太小了?于是我把MaxDateLength从1K到1M试了个遍
还是不行。后来加入log,发现SendBuf越执行越慢,最长一次用了6秒,MemoryStream.Read(bufSend^,MaxDateLength)这一句很快。
后来我又想,是不是Socket的缓冲区太小了,改大一定应该就可以了,结果找了半天delphi的帮助,竟然没发现有这个属性?!!
后来调API,SetSocketOpt,拼命报错。我实在没辙了,诸位CSDN的老大,帮帮忙。救我于水深火热之中吧。
...全文
26 点赞 收藏 17
写回复
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenjbjbjb 2002-04-07
终于搞定了。
kofxdm(八稚)
你说的不太正确。后来我去一些国外的论坛上看到另一种处理方式。
server采用阻塞模式(因为有可能同时给多个客户发文件,每个连接请求创建一个线程处理),而客户端使用非阻塞模式--但如果客户端也要同时接收多个用户的文件那也必须在线程中处理。(此线程的执行代码实际上是一个空循环,由于是在线程中的循环,并不会导致程序其他操作的运行)
接收文件时利用clientSocket的onread和ondisconnect事件。
onread下创建buffer,然后调用Readbuffer,接着保存数据,释放buffer
但是要注意一点,delphi的文档描述如下
Note: Non-blocking sockets do not always receive an OnRead event for the last bit of data passed over the connection. When using a non-blocking socket, check for any unread data in the OnDisconnect event to make sure that everything is handled.
所以还要在ondisconnect里在做一个onread里的事情。就ok了。
后来发一个8M的文件,算上显示进度条,保存文件等收尾操作一共用了16秒
就是它了。这下可以找mm去了。但愿还没被人拐走。呵呵

来者有分!!!不会让大家白辛苦的。




回复
lastshrill 2002-04-05
你是把8M的文件一次读到了一个Buffer里吗?
如果是这样的话,你把它分成几份,分几次发送试试
回复
chenjbjbjb 2002-04-05
太大?
我从1k到1m都设过了。不会的,我试过我改动buffuer的大小,速度变换不大
回复
njbudong 2002-04-05
可能是你的缓冲池定义的太大的缘故!

回复
chenjbjbjb 2002-04-05
up
回复
kofxdm 2002-04-05
对5秒,但是如果网络速度不好的话,可能要慢些,但是绝对用不了30秒以上的。
回复
chenjbjbjb 2002-04-05
我试试。5秒?这么夸张?
回复
kofxdm 2002-04-05
我做了,用了5秒左右来着。用的是Delphi6 Indy的控件,建议你也使用Indy中的控件。idTcpserver,idtcpclient.
我以前也是用Dephi5做的,差点搞的吐血也没有搞好,用了DELPHI6一天就OK了。
回复
chenjbjbjb 2002-04-05
有没有人做过发送文件,8M的文件发了多久????!!!
回复
chenjbjbjb 2002-04-05
先别收藏,问题还没有解决了。快帮帮忙。
我们经理更我急,说“怎么这么慢?”
来人啊!


回复
Liusp 2002-04-05
收藏
回复
chenjbjbjb 2002-04-05
没有人做过这方面的东东吗?速度是这样的吗?
我用icq发送(UDP)8M只用了17秒。
在TCP上的传输很多,Smtp、rpc什么的,都挺快的啊。
是不是Socket的Buffer太小(这里的Buffer是指Socket的,不是我读取对文件数据时键的buffer)。可是在delphi里怎么设置这个buffer呢。
回复
chenjbjbjb 2002-04-05
可能是我没说清楚,是这样
While data not over Do
GetMem for Buffer
Read Data from file into Buffer
Socket.SendBuffer
FreeMem(Buffer)
end;
to redwoodnymph(红蜂鸟)
是不是想说Getmem和Freemem占用了太多的时间,我试了一下,这两个操作非常快,几乎不耗时。用GetTickCount计算操作之间的差值一直是0,我想不是这里的问题。
回复
lastshrill 2002-04-05
你再Loop前开Buffer,Loop Finish后再释放
回复
chenjbjbjb 2002-04-05
不是啊,我不是loop until data over了吗
一次从文件读取MaxDateLength个字节发送
回复
chenjbjbjb 2002-04-04
释放了,我后面的代码没有贴出来。
回复
njbudong 2002-04-04
MemoryStream 没有释放.
回复
发动态
发帖子
Delphi
创建于2007-08-02

4809

社区成员

Delphi 开发及应用
申请成为版主
社区公告
暂无公告