benchmarkMe.go
文件中。另外,这次用到的算法将会详细的讲解。fiboTCP.go
,并把代码分成五部分。由于把 web 服务的端口号定义为命令行参数被认为是良好的实现方式,这次 fiboTCP.go
将完全按此来做。fiboTCP.go
的第一部分如下:fiboTCP.go
的第二部分如下:f()
函数实现了斐波纳切序列自然数的生成。一开始看这个算法很难理解,但它非常有效且运行速度也很快。首先,f()
函数使用了一个被命名为 fn
的字典,这在计算斐波纳切序列数时很不寻常。第二,f()
函数使用了一个 for
循环,这也相当不寻常。最后,f()
函数没有使用递归,这也是它执行快的主要原因。f()
函数中用到的算法思想使用了动态规划技巧,每当一个斐波纳切数被计算后,就把它放入 fn
字典中,这样它就不会再被计算了。这个简单的想法节省了很多时间,特别是需要计算较大斐波纳切数时,因为您不必对相同的斐波纳切数计算多次。fiboTCP.go
的第三部分如下:handleConnection()
函数处理并发 TCP 服务器的每个客户端。fiboTCP.go
的第四部分如下:fiboTCP.go
的剩余代码如下:go handleConnection(c)
声明实现了程序的并发性,每次连接一个新 TCP 客户端时它就开启一个新的 goroutine。goroutine 被并发执行,使服务器有机会服务更多的客户端。fiboTCP.go
并使用 netcat(l)
和 TCPclient.go
在俩个不同的终端窗口和它交互,输出如下:TCPclient.go
这边的输出如下:netcat(l)
这边的输出如下:STOP
字符串给服务进程时。为指定 TCP 客户端服务的 goroutine 将终止,这将引起连接关闭。9000
端口,这意味着您仍能连接 9000
端口。输出的头俩行显示有个客户端使用 57309
端口与服务进程通信。第三和第四行证明有另一个客户端连接到监听 9000
端口的服务上。这个客户端使用的 TCP 端口是 57035
。