我一直在寻找一本关于这个主题的好书或文章,但没有找到太多。对于特定的场景,我没有找到一个很好的例子 - 一段代码。像客户/服务器对话。 在我的应用程序协议中,他们必须发送/接收消息。喜欢: 服务器想要将文件发送到客户端 客户可以或不, 如果他接受,服务器将通过相同的连接/套接字发送字节。 我的应用程序的其余部分都使用阻塞方法,服务器有一个方法
继承人的所作所为:
服务器方法:
public synchronized void sendFile(File file)
{
//send messsage asking if I can send a file
//block on read, waiting for client responde
//if client answers yes, start sending the bytes
//else return
}
客户端方法:
public void reciveCommand()
{
//read/listen for a command from socket
//if is a send file command handleSendFileCommand();
//after the return of handleSendFileCommand() listen for another command
}
public void handleSendFileCommand()
{
//get the file server want to send
//check if it already has the file
//if it already has, then send a command to the socket saying it already has and return
//else send a command saying server can send the file
//create a FileInputStream, recive bytes and then return method
}
我百分之百确定这是错误的,因为服务器和客户端无法通过双向通话,我的意思是,当服务器想要向服务器发送命令时,他们必须遵循命令的顺序,直到该对话为止完成后,只有这样,他们才能发送/接收另一系列命令。这就是为什么我做了所有发送请求同步的方法
我没有花很多时间意识到我需要研究这种应用的设计模式...... 我读到了责任链设计模式,但我不知道如何在这种情况下使用它或其他好的设计模式。
我希望有人可以帮我一些代码示例。 提前致谢
答案 0 :(得分:1)
synchronized
关键字意味着完全不同的东西 - 它将方法或代码块标记为critical section,一次只能执行单个线程。你在这里不需要它。
然后,TCP连接在字节流级别上是双向的。服务器和客户端之间的同步由交换的消息驱动。将客户端(同样非常适用于服务器)视为state machine
。某些类型的消息在当前状态下是可接受的,有些不是,有些则将节点切换到不同的状态。
由于您正在研究设计模式,State pattern
在这里非常适用。