关于TCPServer和TCPClient的一个简单例子…不能理解,该如何处理

关于TCPServer和TCPClient的一个简单例子……不能理解
费了好多天才写出的一个TCPServer和TCPClient的例子,代码很少,看起来好像挺容易,但是有些东西还是不理解……
procedure TForm1.TSAccept(Sender: TObject; ClientSocket: TCustomIpClient);
var //Id:Cardinal;
  a: string;
begin

CS :=  ClientSocket;
ListBox1.Items.Add(CS.RemoteHost);
Memo1.Lines.Add(DatetimeTostr(Now));        
Memo1.Lines.Add(CS.RemoteHost + ':');
Memo1.Lines.Add(CS.Receiveln());
//BeginThread(nil,0,@Wait2,nil,0,ID);
  while true do /{为什么我单步执行到这里……程序就直接Running了?我没有用线程,可是用死循环接受消息时也不会卡。 在这个循环里的代码明明在执行,可是无法下断,百思不得解! }
  begin
   a := CS.Receiveln();       //receive message form Client
    if a = '' then continue;
    Form1.Memo1.Lines.Add(DateTimeToStr(Now));
    Form1.Memo1.Lines.Add(CS.RemoteHost + ':');
    Form1.Memo1.Lines.Add(a);
  end;
end;

还有这两个组件的OPen属性是干什么的?BlockMode是阻塞模式,可是到底有什么用?
(我之前看过C++的网络编程,感觉Delphi封装的组件的用法和Socket的原理相差太多,影响初学者(如我)的理解,我这样的想法对吗)
网络编程 delphi TCPSever TCPClient

------解决方案--------------------
Server.Open
1. CreateSocket
2. Bind
3. Listen
源代码中看似还有一组对 TSocket,TSockAddrIn 的赋值。

Client.Open
1. CreateSocket
2. Connect

而所谓的Block是指。
当调用Socket函数的时候,如果是阻塞的,则在没有完成(比如:Send,没有完成写入缓存的时候,就等待着)。
而NoBlock则会立即返回。
这个就简单理解成
SendMessage 阻塞
PostMessage 非阻塞。

------解决方案--------------------
首先,你得先了解阻塞模式与非阻塞模式的区别。
虽然刚开始你会觉得比较容易理解、比较容易写的是非阻塞模式,
其实很多人实际用过觉得非阻塞模式没那么好用/实用。
所以,初学者的你,应该学习阻塞模式。
因为阻塞模式比较接近大部份研发人员的思考方式。

比如,你为什么要写一个死循环来读信息?
因为你用阻塞模式在思考。
如果你用非阻塞模式思考问题,你就不会用死循环,而是直接在事件处理里写代码。

OK, 假设你接受使用阻塞模式,
那有一个很大的门坎横在你的面前:多线程。
因为在服务器端,要服务N个客端,而线程又阻塞住了,
当然要用多线程才能解决。

这往下说,话题就多了。
建议你先从了解什么是阻塞模式开始。

ok, 什么是阻塞模式呢?
简单的说就是:当你调用它而目前没有收到信息时,它就阻塞在哪里等,直到有信息来时。

有一点像:你叫儿子去小区门口看看爸爸回来了没有。儿子一去就没回音了,因为他一直站在小区门口,一直等,可能等好几个小时,直到爸爸出现在小区门口。

ok,先从这里开始吧。