【问题标题】:JAVA Wrapping Socket as a Singleton class in a multiscreen Swing appJAVA Wrapping Socket 作为多屏 Swing 应用程序中的单例类
【发布时间】:2017-09-28 09:42:20
【问题描述】:

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

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 知道)

【问题讨论】:

    标签: java multithreading swing sockets design-patterns


    【解决方案1】:

    保留ConnectionHandler 单例是有意义的,原因如下:

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

    【讨论】:

      【解决方案2】:

      在单例中保持连接还有一个额外的好处:您很可能希望在专用线程中运行所有网络通信。单身人士可以在这方面提供很大帮助。

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

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

      【讨论】:

      • Jens 谢谢这实际上是我正在做的,我将上面的类重命名为 Connection 只留下构造函数和 Send 和 Receive 方法,并做了一个单独的 connectionHandler Runnable,并且有一个用于传出和传入的查询通信,因为我还将发送 Ping 并检查会话状态和僵硬
      猜你喜欢
      • 2012-03-21
      • 2014-10-07
      • 2013-02-08
      • 2012-09-13
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多