Sockets 客户端/服务器对话-我做错了吗?

Sockets 客户端/服务器对话-我做错了吗?,sockets,network-programming,Sockets,Network Programming,我有一个使用套接字制作的客户机/服务器应用程序。 问题是,当我发送一个命令请求一些信息并等待回复时,我会阻止它,直到回复到来。这使得实现双向请求/响应变得更加困难。 让我用一个例子来解释: 客户端可以列出服务器目录中的文件,因此我在代码中执行类似的操作: 客户端代码: 1-发送请求命令:LS/ 2-等待LS响应的块。 3-获取文件列表 我这样做的原因是客户可能需要传输文件,所以我会: 1-发送文件传输请求。 2-读取时阻塞,等待查看服务器是否接受 3-仅当它确实存在时,才发送文件 因此,在我不得

我有一个使用套接字制作的客户机/服务器应用程序。 问题是,当我发送一个命令请求一些信息并等待回复时,我会阻止它,直到回复到来。这使得实现双向请求/响应变得更加困难。 让我用一个例子来解释: 客户端可以列出服务器目录中的文件,因此我在代码中执行类似的操作:

客户端代码: 1-发送请求命令:LS/ 2-等待LS响应的块。 3-获取文件列表

我这样做的原因是客户可能需要传输文件,所以我会: 1-发送文件传输请求。 2-读取时阻塞,等待查看服务器是否接受 3-仅当它确实存在时,才发送文件

因此,在我不得不添加服务器请求任何东西的能力之前,一切都很好。 在我的代码中,客户端可以请求任何内容,并在等待响应时被阻止。 然后,服务器可能会发送任何对客户端等待的响应没有意义的请求命令。这会把谈话搞砸的

我的一个决心是永远不要阻止别人回应。 我会发送一个请求命令,然后回来等待来自服务器的任何请求或响应,如果响应到达,我会发送文件。 所以问题是,我是否必须在每个请求/响应对中添加一个ID来知道哪个响应是针对哪个请求的

PS:我对如何设计主机之间的网络对话非常迷茫,从来没有读过一本关于设计网络应用程序模式的书


PS2:我的英语很差

您需要的是服务器和客户端之间的应用程序级别

对于您的特定情况,最简单的方法是让服务器预先说明下一步要发送什么。比如说,在消息前面放一个消息类型字节。假设0表示请求,1表示响应,等等。将其粘贴到switch语句中,您就完成了


将消息长度也包含在头中是个好主意,因此,接收代码知道从网络获取完整消息需要多少字节。

只是为了添加更多信息…我有一个类客户端,我的所有方法在Java中都是这样的:public List remotedirstring dir throws exception要获取正确的消息,我使用ISO-8859-1编码的字符串分隔符\r\n…如果我这样做的话双向I将无法在客户机中实现类似列表listRemoteDirString dir的方法I???分隔消息也可以。您只需要在消息的开头包含消息类型。比如说,第一个单词/标记就是类型。例如,在HTTP上,第一个标记是HTTP方法GET、POST等。它实际上是消息类型。好的,我会试试。此外,我还了解到人们在课堂上包装消息,这是一种好的做法吗?这可能是一个好主意-使用一些通用代码解析网络中的原始字节,创建消息对象,嘿,尼古拉,也许你能在这里帮助我:在你回答的第一个问题上,我没有正确地表达自己,但现在通过代码示例,我想我可能会得到一个好的答案。。。谢谢