我正在学习java并且有一个小问题。我目前正在制作一个工作正常的多线程聊天服务器。当你连接一个在线列表时,它看起来像一个简单的MSN信使,你双击名字打开一个聊天窗口。
服务器为每个客户端提供2个serverSockets。
第一个是处理在线列表并更新和删除用户。 第二个是处理消息。 (我做了两个单独因为我不希望用户列表的名称与消息冲突)。
我的问题是,如果我想添加一个功能,以便客户端可以发送文件给彼此,我应该为那个创建第三个ServerSocket吗?
或者我是否完全错误地构建了程序?
答案 0 :(得分:1)
您正在错误地构建应用程序。您需要一个单一的套接字服务器来拉取消息,然后将它们分派给一组工作者。如果您愿意,每种消息类型可以有一个工作者。工人们对网络层一无所知。他们应该接受一个命令并返回一个值。给他们命令的网络类应该处理将结果写回客户端。这样,所有网络和安全逻辑都可以在服务器类中,并且每个工作人员可以在不知道网络的情况下专注于其专业任务。然后,您应该编写junit测试,在不需要网络类的情况下隔离测试每个工作程序。然后你的主程序只需要创建和配置你的(junit tests!)工作者,实例化服务器类,并给你的工作人员,调用start方法来启动你的服务器。欢迎来到软件工程,智慧的第一步是通过提出这样的问题来寻求学习。
编辑我忘了回答文件处理问题:-)真正的聊天服务可能会为客户端(例如手机)带来低带宽。将大文件扔到另一个套接字上可能会使可用的客户端带宽饱和,使得聊天体验不佳,而许多文件尝试通过一个或多个套接字上传。一个好的方法是拉出文件的小块并添加到有界队列(LinkedBlockingQueue)。然后查看队列中的下一个文件块以与用户聊天命令交替发送。在服务器上,网络类读取下一条消息,该消息可以是块或聊天命令,并分派给适当的工作人员。
可能有一个"启动文件上传命令"具有网络服务器类的每个文件创建一个新的FileUploadWorker以允许并发上载。然后在客户端上可能有三个文件被分成单个队列,服务器上有三个工作人员,每个文件一个,而用户正在聊聊他们的聊天命令,总是先排队到服务器排队的文件块之前优先级低于实际聊天。