我正在Java Swing中编写一个聊天应用程序,该应用程序具有使用套接字的自定义协议和服务器后端。我正在制作客户连接处理程序。这是我到目前为止的代码:
package Client;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.*;
import Common.Message;
public class ConnectionHandler {
Socket socket;
DataInputStream input;
DataOutputStream output;
public ConnectionHandler() throws UnknownHostException, IOException {
socket = new Socket(Client.HOST_INET,Client.PORT);
input = new DataInputStream(socket.getInputStream());
output = new DataOutputStream(socket.getOutputStream());
}
public void sendMessage(Message message) throws IOException {
output.writeUTF(Message.disasseble(message));
}
public Message getMessage() throws IOException {
String message;
message = input.readUTF();
return Message.assemble(message);
}
public void closeConnection() {
}
private void reconect(){
}
}
该应用程序由持有登录,注册和聊天jpanels的Cardlauut组成。每个JPanel都需要连接,只要应用程序运行,应保持连接。登录屏幕发送登录消息/在注册和聊天屏幕上相同的答案。
问题我应该为Connectionhanler使用单身设计模式吗?如果引用在单独的线程上,例如带有que的连接线程(例如连接线程),它还可以工作吗?(我知道我需要时不时地丢失服务器,或者可能会丢失连接,以便我需要审核并让UI知道)
出于以下原因保持ConnectionHandler
单例很有意义:
- 您可以在
ConnectionHandler
实例中集中管理连接状态。例如,如果用户未登录,请勿发送聊天消息。 - 允许按顺序发送消息。如果您不使用Singleton模式,从理论上讲,可以在多线程应用程序中退出订单。
- 减少服务器上的负载,因为它每个客户端只有一个插座连接。
将连接保持在单顿中有一个其他优势:您很可能希望在专用线程中运行所有网络通信。单身人士可以在那里大大帮助。
也可以在"每个连接"基础上处理所有相关的与连接相关的属性(登录?,运输加密,...)。
应事先考虑处理带外通信(插座忙时登录或通知)。