=========100分求解一个关于NetWorkStream的奇怪问题==========

yanga 2006-10-23 11:42:31
我在写一个邮件的收发程序,主要步骤如下:

===========================================
1.连接到邮件服务器并提供账号密码登录.

2.获取邮箱的邮件数量及大小.

3.循环读取邮件内容并添加到一个DataTable对象.

4.断开与邮件服务器的连接.
===========================================


与服务器的数据通信用Socket

发送与接收数据用NetWorkStream

主要的功能我都写在一个名为"Email"的类里面

显示数据的页面名为"WebForm1.aspx"




我的问题是:直接运行该程序的话,总是有规律的少一部份邮件数据,例如:

总邮件数为:10
邮件的ID 邮件的内容
1 无
2 无
3 有
4 有
5 无
6 无
7 无
8 有
9 无
10 无

当我把断点设在收邮件的"Email"类中函数"ReadPOP"上逐步调试时又能正常取到所有邮件数据了.

我的感觉就是在向服务器发送命令后,必需要稍微等一下再收就可以正常得到数据否则就不行.

有个朋友和我说要把缓冲区清理一下才行.

向服务器发送命令与接收邮件数据的函数如下:
向服务器发送命令

Private Sub WritePOP(ByVal s As String)
s &= ControlChars.CrLf
NetStream.Write(Encoding.ASCII.GetBytes(s.ToCharArray), 0, s.Length)
End Sub

接收邮件数据

Private Function ReadPOP() As String
Dim myReadBuffer(1024) As Byte
Dim numberOfBytesRead As Integer = 0
Dim s As String = ""
Do
numberOfBytesRead = NetStream.Read(myReadBuffer, 0, myReadBuffer.Length)
s &= Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead)
Loop While NetStream.DataAvailable
Return s
End Function
...全文
242 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yanga 2006-10-23
  • 打赏
  • 举报
回复
虽然目前这样做是可以了,但我想搞清楚的是为什么会出现这种情况.

MSDN里对DataAvailable属性的描述是:获取一个值,该值指示在要读取的 NetworkStream 上是

否有可用的数据。

但为什么在我的这个程序里它为什么出现错误的叛断呢?
geodetic 2006-10-23
  • 打赏
  • 举报
回复
原来如此。
学习
呵呵
yanga 2006-10-23
  • 打赏
  • 举报
回复
再来看一下ReadPOP函数:

Private Function ReadPOP() As String
Dim myReadBuffer(1024) As Byte
Dim numberOfBytesRead As Integer = 0
Dim s As String = ""
Do
numberOfBytesRead = NetStream.Read(myReadBuffer, 0, myReadBuffer.Length)
s &= Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead)
Loop While NetStream.DataAvailable
Return s
End Function

函数里用了一个Do......Loop循环,是否循环的靠 NetStream对象的DataAvailable方法来叛断,我产生了一个凝问,在这种情况下只靠NetStream.DataAvailable方法来叛断准确吗?

大家知道在向POP服务器发出"RETR"命令取邮件时,POP服务器返回的邮件是以"."+回车+换行符为结尾的,于是我就在 NetStream.DataAvailable方法后又加上了这个条件如下:

Do
............
............
Loop NetStream.DataAvailable Or s.EndsWith("." & ControlChars.CrLf) = False

也就是说当NetStream里还有数据或者邮件内容的最后不是"."+ControlChars.CrLf时继续循环直到NetStream里没有数据并且邮件内容的最后是"." + ControlChars.CrLf时才结束循环.

最后测试,成功了!
yanga 2006-10-23
  • 打赏
  • 举报
回复
补充并明确一下接收的问题:

1.连接到POP服务器并登录时发送与接收数据同登录完毕发送接收数据用的都是Email类里的
WritePOP过程与ReadPOP函数,登录过程中接收的数据是完整的,而收取邮件内容时数据就不完
整了.

2.我的程序循环取邮件内容时第一,第二封邮件内容没有取到数据,当运行到要取第三封邮件的数据时,第一封邮件的内容才删删来迟.可我的程序把本来第一封邮件的内容付给第三封邮件了,结果就造成了显示第一,第二封邮件时没有数据,第三封有数据但那是第一封的数据.
myminimouse 2006-10-23
  • 打赏
  • 举报
回复
帮顶
geodetic 2006-10-23
  • 打赏
  • 举报
回复
不是高手。
很有趣的问题,帮顶。

MSDN NetworkStream.Flush有如下说明:
Flush 方法实现 Stream.Flush 方法,但是因为 NetworkStream 不进行缓冲处理,所以此方法对网络流无效。

所以我想应该不是缓冲的问题,而且微软的东西不可能有这么严重的bug就release吧。

建议在收发的客户端和服务器端都弄一个网络监控工具,看看缺失数据是否发生传送行为。

还有就是用OE等客户端试试是否有问题,另外看看POP服务器的设置。
yanga 2006-10-23
  • 打赏
  • 举报
回复
来人啊~~!高手呢????
yanga 2006-10-23
  • 打赏
  • 举报
回复
是不是我没把问题说清楚?怎么没人啊~~~
发帖
.NET社区

6.1w+

社区成员

.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
帖子事件
创建了帖子
2006-10-23 11:42
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。