这只是一个设计服务器的一种方法,当对服务器的设计有了一定的了解后,就能用你所希望的方式来修改这段伪代码:

 

ss = socket()     #创建服务器套字节
  ss.bind()       #把地址绑定到套字节上
  ss.listen()       #监听连接
  inf_loop:        #服务器无限循环
    cs = ss.accept()   #接受客户端连接
  comm_loop:      #通信循环
    cs.recv()/cs.send() #对话(接受与发送)
  cs.close()        #关闭客户端套字节
ss.close            #关闭服务端套接字(可选)

 

  所有的套接字都用socket.socket()函数来创建。服务器需要“坐在某个端口上”等待请求,所以他们必须要“绑定”到一个本地的地址上。由于TCP是一个面向连接的通信系统,在TCP服务器可以开始工作之前,要先完成一些设置.TCP服务器必须“监听”(进来的连接),设置完成之后服务器就可以进入无限循环了。

  一个简单的(单线程的)服务器会调用accept()函数等待连接的到来。默认情况下,accept()函数是阻塞式的,即程序在连接到来之前会处于挂起状态,套字节也支持非阻塞模式。

  一旦接收到一个连接,accept()函数就会返回一个单独的客户端套接字用于后续的通信,使用新的客户端套接字就像把客户的电话转给一个客户服务人员,当一个客户打电话来的时候,总机接了电话,然后把电话转到合适的人那里来处理客户的请求。

  这样就可以空出总机,也就是最初的那个服务套接字,于是,话务员就可以等待下一个电话(客户请求),与此同时,前一个客户与对应的客户服务人员在另一条线路上进行着他们之间的对话。同样的,但一个请求到来时,要创建一个新的端口,然后直接在那个端口上与客户对话,这样就可以空出主端口来接受其他客户的连接。

在临时套接字创建好之后,通信就可以开始了,客户与服务器都使用则个信创建套接字进行数据的发送与接收,知道客户连接关闭之后,服务器继续等待下一个客户端的连接,代码的最后一行,会把服务器的套接字关闭,由于服务器处在无限循环中,不可能会走到这一步,所以这一步是可选的,我们写这一句话的主要目的是要提醒读者,在设计一个更智能的退出方案时,比方说,服务器被通知要关闭时,要确保close()函数会被调用。