关于Socket编程的诸多疑问,大家都来讨论下哈! ( 积分: 300 )

  • 主题发起人 主题发起人 anyway
  • 开始时间 开始时间
A

anyway

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟对Socket编程不是很了解,手头网络编程的书又很少
在此问几个比较基本的问题,希望各位高手赐教
1、我使用TServerSocket和TClientSocket来实现客户端与服务端的数据传输时,阻塞模式的运行原理是怎样的呢?也就是说在每个层面都是怎么来实现这个机制的?
2、服务端和客户端的阻塞和非阻塞的组合方式都适合什么情况,具体应该注意什么呢?
3、对于阻塞模式下的那些线程执行顺序和原理还不是太了解,写代码时所要做的工作也不太了解,忘各位不吝赐教。
 
1、我使用TServerSocket和TClientSocket来实现客户端与服务端的数据传输时,阻塞模式的运行原理是怎样的呢?也就是说在每个层面都是怎么来实现这个机制的?
阻塞模式即时排队了,例如发送A,B,C,D,E到对方,对方收到
A,B,C,D,E,但你不即时处理,可能就会出现错误的判断,例如判断成
C,B,A,D,E,所以最好用线程方式, BBS 里面的例子太多了!

2、服务端和客户端的阻塞和非阻塞的组合方式都适合什么情况,具体应该注意什么呢?
阻塞:
数据量大,连接多!

非阻塞:
数据量少,命令方式,例如:
发送 GET 表示开始抓图
发送 CLOSe 表示开始关机 等等!

3、对于阻塞模式下的那些线程执行顺序和原理还不是太了解,写代码时所要做的工作也不太了解,忘各位不吝赐教。
BBS 里面的例子太多了!
 
wql对于你的一番卓见, 我深表质疑. 本人无意攻击你!

1、我使用TServerSocket和TClientSocket来实现客户端与服务端的数据传输时,阻塞模式的运行原理是怎样的呢?也就是说在每个层面都是怎么来实现这个机制的?
阻塞模式即时排队了,例如发送A,B,C,D,E到对方,对方收到
A,B,C,D,E,但你不即时处理,可能就会出现错误的判断,例如判断成
C,B,A,D,E,所以最好用线程方式, BBS 里面的例子太多了!

**** 怎么好像TCP的有序数据包变成无序的了呢,会这样吗? *****
当发送A, B, C, D, E给你时,如果你不即使处理.将可能导对方产生 WSAEWOULDBLOCK错误.表明你的接收缓存(RecvBuffer)已经满了.所以这方你应该注意的问题是应该适当的加大SocketBuffer(recvBuffer/sendBuffer),或自己建立一个缓存机制.根本不可能导至判断成 C,B,A,D,E 除非你的程序代码有错误.

2、服务端和客户端的阻塞和非阻塞的组合方式都适合什么情况,具体应该注意什么呢?
阻塞:
数据量大,连接多!
*** ***
我的意见:采用阻塞模时对数据量大,连接多的情是最不利的.原因有几,你可以想像一下,一个程序连续发送100个SendMessage的感受.

非阻塞:
数据量少,命令方式,例如:
发送 GET 表示开始抓图
发送 CLOSe 表示开始关机 等等!

**** ****
我的建议是: 适用于 数据量相对较大,连接相对较多的情况.

3、对于阻塞模式下的那些线程执行顺序和原理还不是太了解,写代码时所要做的工作也不太了解,忘各位不吝赐教。
BBS 里面的例子太多了!

****对此,我建立你看一下看一本书 Microsoft的Windows网络编程.***,另外如果你需要写数据量和用户量较大较多的通讯应用程序,建立你不要直接使用Delphi自带的通讯组件,自己加入缓存机制,或者使用其它的第三方组件.像Indy等. 谢谢!

欢迎批评指正.
 
来学习。
 
iceapi:
呵呵!有学习研究精神!
 
to wql: 相互学习! [:D]
 
如果真的要使用Socket,就不要太关注于Delphi提供的控件,包括Indy控件
对于小范围的应用这没有问题
如果要写服务器,最好学习一下Socket本身的东西
至于说手头的书少,建议你看《Network Programming for Microsoft Windows, Second Edition》
这本书是权威
 
http://www.delphibbs.com/keylife/images/u196832/WinSock规范及应用winsock.rar
 
后退
顶部