为什么在TCP服务器程序中需要先读取()再写入()?

为什么在TCP服务器程序中需要先读取()再写入()?,tcp,tcplistener,Tcp,Tcplistener,根据我的理解,一个简单的TCP服务器将编码如下 套接字()-bind()-listen()-accept()-read()-write() 客户机将编写如下 套接字()-bind()(可选)-connect()-write()-read() 请注意客户端程序和服务器程序之间的read()和write()调用顺序的差异 是否要求在服务器程序中总是先读取()再写入(),如果是,为什么 谢谢, Naga您可以按任意顺序执行它们。但是,服务器通常会从read()操作生成响应,然后使用write()操作写

根据我的理解,一个简单的TCP服务器将编码如下

套接字()-bind()-listen()-accept()-read()-write()

客户机将编写如下

套接字()-bind()(可选)-connect()-write()-read()

请注意客户端程序和服务器程序之间的read()和write()调用顺序的差异

是否要求在服务器程序中总是先读取()再写入(),如果是,为什么

谢谢,
Naga

您可以按任意顺序执行它们。但是,服务器通常会从read()操作生成响应,然后使用write()操作写入响应,所以这个顺序是合理的


如果您正在处理多个客户端,则应使用select等多路复用器在客户端有数据准备读取时通知您,这样,您的服务器就不会在每次尝试从未发送任何数据的客户端读取()时锁定。您可以按任意顺序执行这些操作。但是,服务器通常会从read()操作生成响应,然后使用write()操作写入响应,所以这个顺序是合理的


如果您正在处理多个客户机,则应使用select等多路复用器在客户机准备好读取数据时通知您,这样,您的服务器不会在每次尝试从未发送任何数据的客户机读取()时锁定。这不是强制性的,但在写入响应之前,服务器读取请求是有意义的。请注意,双方都必须经常读取,以防止分布式死锁:例如,如果双方都在尝试写入而不读取,那么中间的缓冲区将被填满,任何一方的写入都无法继续。一种解决方案是,如果有需要读取的内容(这适用于客户端和服务器),则使用一个单独的线程保持读取。

这不是强制性的,但服务器在写入响应之前读取请求是有意义的。请注意,双方都必须经常读取,以防止分布式死锁:例如,如果双方都在尝试写入而不读取,那么中间的缓冲区将被填满,任何一方的写入都无法继续。解决这个问题的一个方法是,如果有需要阅读的内容(这适用于客户端和服务器),则使用一个单独的线程来保持阅读。

简单的答案是否定的。您可以自由地做任何您想做的事情

然而,我将很快提出警告,因为大多数协议都设计为等待客户端发送内容。毕竟,服务器本质上是为请求服务的,需要等待知道该请求是什么,无论是“GET/”还是“HELO”或其他什么。因此,服务器在将任何响应写回客户端之前进行读取是相当自然的


也就是说,您可以在阅读之前将版本信息转储到客户端。要查看效果,请使用telnet连接到您的服务器。

简单的答案是否。您可以自由地做任何您喜欢的事情

然而,我将很快提出警告,因为大多数协议都设计为等待客户端发送内容。毕竟,服务器本质上是为请求服务的,需要等待知道该请求是什么,无论是“GET/”还是“HELO”或其他什么。因此,服务器在将任何响应写回客户端之前进行读取是相当自然的


也就是说,您可以在阅读之前将版本信息转储到客户端。要查看效果,请使用telnet连接到您的服务器。

这不是要求,服务器程序无需先读取即可写入套接字。但在许多情况下,服务器程序必须知道客户机想要什么-所以它首先调用read()。

这不是一个要求,服务器程序可以在不读取的情况下写入套接字。但在许多情况下,服务器程序必须知道客户端想要什么-因此它首先调用read()。

事实上,有很多协议,服务器在客户端连接后立即发送横幅或欢迎消息-SSH、SMTP、,POP3和IMAP出现在脑海中。事实上,有很多协议,服务器在客户端连接时立即发送横幅或欢迎消息—SSH、SMTP、POP3和IMAP出现在脑海中。