收费系统体会(1) 一次纠结就是一次大的进步.

本文记录了一次使用VB.NET开发数据库应用的经历。作者从零开始,详细讲述了在开发过程中的三次重大挑战:登录模块设计、学生信息维护及报表制作。通过解决这些问题,作者不仅掌握了数据库操作技能,还学会了有效查找和利用资料。

15号开始做系统.30号正式做完.经过了整整半个月的时间.自己在这段时间里发生了很大的变化.无论是在技术上,还是思想上.都感觉进不了很多.利用这几天的时间.逐步总结,完善一下收费系统.

这里主要说说自己在思想上的体会.

做系统的时候,大约经过了三次大的纠结.

第一次是刚刚做第一个功能.登录模块设计.最初的想法是利用存储过程实现.首先连接数据库,查询,返回.

由于刚开始使用vb.net开发环境.有点陌生,再加上对数据库操作的不熟悉.让自己很是恼火.做一遍,无法实现.再做一遍,还是不行.然后就开始疯狂的找资料.去图书馆借了几本厚厚的书,一本一本的找.主要是找vb.net如何连接数据库,然后对数据库进行增删改查.在网上找各种资料.感觉他们写的都不是自己所要的.很多的都是不清楚.

看到图书馆中号称典藏的书,数据库操作竟然还用的是拼接字符串.让我很是费解.看到网上很多的做法.很多写的不是很清楚.当时自己心里就愤愤的想.等我做出来以后,一定完美的写一篇关于vb.net 操作数据库的文章.让那些所谓的典藏见鬼去吧.

最后经过自己的的各种找,还请教了小兵,争光.终于经过快两天的时间.把登录做了出来.然后把数据库操作掌握了一下.豁然开朗.感觉体会很深.

看到成功以后,心里一阵欣喜.在这过程中.我掌握了数据库的基本操作.感觉最主要的是学会了找资料.以前光说找资料.那些找的东西都简单,基本上百度一下就ok了,现在必需找各种资料.然后去对比,消化,吸收.最让我欣喜的就是学会了看msdn,以前觉得msdn晦涩难懂.不愿意看.其实当你静下心来仔细看.发现最经典的都是在msdn上.其他的都是模仿的msdn.以后不会了首先想到的是msdn.伟大的资料库.

第二次纠结是做学生信息维护这块.

想要实现在datagridview中显示数据并在行尾有一个链接,能对数据进行操作.就开始研究这个控件的属性.看了很多的资料.对msdn研究了多遍.

最终实现了效果.感觉每一个想法的实现都是需要不断地摸索的.没有现成的资料.凡是有现成资料的.都是最简单.最没用的东西.

第三次是在做报表这块.

有了上两次的经验以后.自己遇到任何问题也不会慌张了.手中有粮,遇事不慌.心里有了信心.只要反复的研究,看看资料,做做demo就ok了.

<think>我们正在讨论Delphi中使用TCP传输时一次最多能传输的字节数。首先,需要明确的是,TCP协议本身并没有规定单次传输的最字节数上限,因为它是一个流式协议,数据被视为连续的字节流。然而,在实际编程中,我们通常通过发送和接收缓冲区来操作数据。在Delphi中,使用Indy组件(如TIdTCPClient和TIdTCPServer)或其它套接字库时,一次发送或接收的数据量受到几个因素的影响: 1. **TCP窗口小**:这是由接收方通告的,表示当前接收方还能接收多少数据。发送方不会发送超过接收方窗口小的数据。 2. **最小(MSS)**:这是在TCP连接建立时通过三次握手协商的,通常是接收方和发送方的MTU(最传输单元)减去TCP和IP头部小(一般为40字节)。MSS的典型值是以太网环境下的1460字节(因为MTU是1500字节)。 3. **发送和接收缓冲区小**:在应用程序层面,我们调用发送函数时指定的缓冲区小。在Delphi中,使用TIdTCPClient的`WriteBuffer`方法或`SendBuffer`方法时,可以指定任意小的缓冲区,但底层套接字可能会将其拆分成多个不超过MSS的段。 因此,在Delphi中,理论上一次调用可以发送任意长度的数据(例如,几十KB甚至MB),但底层TCP协议栈会自动将其分段(通常每个分段不超过MSS)。对于应用程序来说,我们不必担心分段,但要注意: - 发送量数据时,可能会阻塞,直到数据被传输到发送缓冲区(如果使用阻塞式套接字)。在非阻塞模式下,则可能只发送部分数据。 - 接收数据时,同样也是流式的,一次接收操作可能只接收到部分数据,因此需要循环接收直到收到完整的数据包。 在Delphi的Indy组件中,发送数据的方法如`WriteBuffer`可以发送任意小的数据块,但实际发送到网络的数据包小受MSS限制。例如: ```delphi IdTCPClient1.WriteBuffer(Buffer, Size); ``` 这里`Size`可以很,Indy内部会循环发送直到所有数据被发送。 但是,如果问题是关于一次发送调用最多能发送多少字节而不被底层协议栈限制,那么答案是没有硬性限制(除了内存限制),因为TCP是流式协议。不过,需要注意的是,如果一次发送的数据量过,可能会导致应用程序占用量内存,并且在等待发送时出现延迟。 另外,还有一点:在Windows操作系统中,套接字发送缓冲区的默认小通常为8KB,但可以通过设置套接字选项(`SO_SNDBUF`)来调整。同样,接收缓冲区小(`SO_RCVBUF`)也可以调整。这些缓冲区小也会影响发送和接收的性能。 总结:在Delphi中,理论上一次调用发送函数可以发送非常的数据(受限于可用内存),但底层TCP协议栈会根据网络条件(MSS、窗口小)将其分成多个数据包传输。因此,应用程序设计时,通常不需要刻意限制单次发送的数据量,但也要注意避免发送过的数据块导致内存占用过高或阻塞时间过长。 注意:这里讨论的是TCP,如果是UDP,则单次发送的数据小受到MTU的限制(通常不超过1472字节,以避免分片)。 §§相关问题§§ 1. 在Delphi中如何设置TCP发送和接收缓冲区小? 2. 如何优化Delphi中的TCP数据传输效率? 3. 在TCP传输中,如何处理数据的分片和重组? 4. Delphi中Indy组件发送数据时需要注意什么? </think>在 Delphi 中使用 TCP 协议进行数据传输时,**单次发送的字节数没有硬性上限**,但实际传输受到以下关键因素影响: ### 关键影响因素 1. **TCP协议特性** TCP 是流式协议(非消息边界协议),数据被视为连续字节流。理论上可发送任意长度数据,但底层会自动分段传输: - 最分段小(MSS)通常为 **1460字节**(以太网 MTU 1500 - IP头20 - TCP头20) - 实际分段小根据网络路径 MTU 动态调整 2. **操作系统限制** - 发送缓冲区小(通过 `setsockopt` 设置 `SO_SNDBUF`) - 默认缓冲区小通常为 8~64 KB,最可扩展至数 MB ```delphi // Delphi 设置发送缓冲区示例 IdTCPClient.Socket.Binding.SetSockOpt(Id_SOL_SOCKET, Id_SO_SNDBUF, 1024*512); // 512KB ``` 3. **Indy组件行为** 使用 `TIdTCPClient.Write/WriteBuffer` 时: ```delphi // 单次写入 10MB 数据(实际会被拆分成多个 TCP 段) IdTCPClient.WriteBuffer(MyData, 10*1024*1024); ``` - Indy 内部自动处理分片和重传 - 写入操作阻塞直到数据进入内核缓冲区(非完全发送) ### 最佳实践建议 1. **合理分段传输** 推荐分段小 **1~64 KB** 平衡效率与延迟: ```delphi const CHUNK_SIZE = 32*1024; // 32KB while BytesSent < TotalSize do begin Chunk := Copy(Data, BytesSent, CHUNK_SIZE); IdTCPClient.WriteBuffer(Chunk, Length(Chunk)); Inc(BytesSent, Length(Chunk)); end; ``` 2. **缓冲区设置** 在连接建立后调整缓冲区: ```delphi procedure TForm1.IdTCPClientConnected(Sender: TObject); begin IdTCPClient.Socket.Binding.SetSockOpt(Id_SOL_SOCKET, Id_SO_SNDBUF, 1024*256); // 256KB IdTCPClient.Socket.Binding.SetSockOpt(Id_SOL_SOCKET, Id_SO_RCVBUF, 1024*512); // 512KB end; ``` 3. **流式传输优化** 对超文件使用 `TIdTCPStream`: ```delphi var FileStream: TFileStream; TCPStream: TIdTCPStream; begin FileStream := TFileStream.Create('largefile.zip', fmOpenRead); try TCPStream := TIdTCPStream.Create(IdTCPClient); TCPStream.CopyFrom(FileStream, 0); // 自动分块传输 finally FileStream.Free; end; end; ``` ### 常见误区 - ❌ 误以为单次 `Write()` 对应单次网络传输 ✅ 实际会被拆分为多个 TCP 段(由操作系统控制) - ❌ 直接发送超内存块导致程序卡顿 ✅ 应使用分块或异步写入 > 📌 结论:**设计时无需纠结单次发送上限,重点保证数据完整性和流量控制**。典型场景建议使用 4~64KB 分段,对 GB 级文件优先流式传输[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值