我必须为我的遗留应用程序(独立)编写一个 TCP 服务器来为它创建一个客户端 - 服务器接口。
我打算编写预分叉(由于线程安全问题而不能使用线程)并发服务器。我需要做两件事。
问:一个简单的示例程序(可能是一个回显服务器)解释了一个预先分叉的并发服务器的关注点和成分。
Q. 服务器将以 JSON 格式交换数据。如何配置客户端socket,让服务端正确知道客户端是否已经在channel上写完json或者还在写的过程中。
为什么要使用线程或叉子?只需使用 Tcl 的事件驱动模型。
proc accept {sock host port} {
fconfigure $sock -blocking 0 -buffering line
fileevent $sock readable [list readsock $sock]
}
proc readsock {sock} {
global sockbuf
if {[read $sock data] < 0} {
if {[eof $sock]} {
# Socket was closed by remote
unset sockbuf($sock)
close $sock
return
}
}
append sockbuf($sock) $data\n
# Check if you got all the necessary data. For Tcl lists, use [info complete]
if {[info complete $sockbuf($sock)]} {
set data $sockbuf($sock)
unset sockbuf($sock)
# process data
puts $sock $data
}
}
socket -server accept 12345
vwait forever; # This will enter the event loop.
如果你真的需要(或想要)使用线程,线程安全在 Tcl 中也不是问题。
但是使用分叉通常最终会或多或少地重新实现线程API。
如果你真的想分叉,那么这里有一些你会遇到的问题:
恕我直言,不值得为分叉付出所有必要的努力。