JAVA将套接字包装为多屏幕Swing应用程序中的单例类

JAVA将套接字包装为多屏幕Swing应用程序中的单例类,java,multithreading,swing,sockets,design-patterns,Java,Multithreading,Swing,Sockets,Design Patterns,我正在用JavaSwing编写一个聊天应用程序,它有一个自定义协议和使用套接字的服务器后端。我正在制作客户端连接处理程序。以下是我到目前为止的代码: package Client; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.*; import Common.Message; public class Connectio

我正在用JavaSwing编写一个聊天应用程序,它有一个自定义协议和使用套接字的服务器后端。我正在制作客户端连接处理程序。以下是我到目前为止的代码:

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(){

    }
}
该应用程序由一个CardLauut组成,其中包含登录、注册和聊天JPanel。每个JPanel都需要连接,只要应用程序正常运行,就应该保持连接。登录屏幕发送登录信息/回答,与注册相同,当然还有聊天屏幕

问题:
我应该为connectionHanler使用单例设计模式吗?如果引用是在一个单独的线程上,比如一个带有que的连接线程,那么它也可以工作吗?(我知道我需要不时ping服务器,否则连接可能会丢失,因此我需要重新连接并让UI知道)

保持
ConnectionHandler
singleton是有意义的,原因如下:

  • 您可以在
    ConnectionHandler
    实例中集中管理连接状态。例如,如果用户未登录,则不要发送聊天信息
  • 允许按顺序发送消息。如果不使用单例模式,从理论上讲,消息在多线程应用程序中可能会无序发送
  • 减少服务器上的负载,因为每个客户端只有一个套接字连接

    • 出于以下原因,保持
      ConnectionHandler
      单例是有意义的:

      • 您可以在
        ConnectionHandler
        实例中集中管理连接状态。例如,如果用户未登录,则不要发送聊天信息
      • 允许按顺序发送消息。如果不使用单例模式,从理论上讲,消息在多线程应用程序中可能会无序发送
      • 减少服务器上的负载,因为每个客户端只有一个套接字连接

      将连接保持在单一线程中还有一个额外的优势:您很可能希望在专用线程中运行所有网络通信。单身汉在那里能帮上大忙

      此外,所有与连接相关的属性(登录?、传输加密等)都可以在“每个连接”的基础上进行处理


      应事先考虑处理带外通信(“注销”或套接字忙时的通知)。

      将连接保持在单一线程中还有一个额外的优点:您很可能希望在专用线程中运行所有网络通信。单一线程可以极大地帮助您

      此外,所有与连接相关的属性(登录?、传输加密等)都可以在“每个连接”的基础上进行处理


      处理带外通信(“注销”或在插座忙时发出通知)应该事先考虑。

      Jens感谢这正是我正在做的,我将上面的类重命名为Connection,只留下构造函数和发送和接收方法,并做了一个单独的connectionHandler Runnable,并对传出和传入的通信有一个que,因为我还将发送ping并检查会话状态和stiffJens感谢这正是我正在做的事情,我将上面的类重命名为Connection,只留下构造函数和发送和接收方法,并且做了一个单独的connectionHandler可运行,并且有一个传出和传入通信的que,因为我还将发送ping并检查会话状态和stiff