簡體   English   中英

在多屏Swing應用中將JAVA包裝插座作為Singleton類

[英]JAVA Wrapping Socket as a Singleton class in a multiscreen Swing app

我正在用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組成,該CardLauut包含登錄,注冊和聊天JPanels。 每個JPanel需要連接,並且只要應用程序正常運行,就應保持連接。 登錄屏幕發送與注冊相同的登錄消息/答案,當然還有聊天屏幕。

問題我應該對connectionHanler使用單例設計模式嗎? 如果裁判位於諸如帶有que的連接線程之類的單獨線程上,裁判也會起作用嗎? (我知道我需要不時對服務器進行ping操作,否則連接可能會丟失,因此我需要重新檢查並讓UI知道)

出於以下原因,保持ConnectionHandler單例是有意義的:

  • 您可以在ConnectionHandler實例內部集中管理連接狀態。 例如,如果用戶未登錄,請不要發送聊天消息。
  • 允許按順序發送消息。 如果您不使用Singleton模式,則理論上可能會在多線程應用程序中無序發送消息。
  • 減少服務器上的負載,因為每個客戶端只有一個套接字連接。

將連接保持為單一狀態還具有另一個優點:您很可能希望在專用線程中運行所有網絡通信。 單身人士可以極大地幫助那里。

同樣,所有與連接相關的屬性(已登錄?,傳輸加密等)都可以在“每個連接”的基礎上進行處理。

應事先考慮處理帶外通信(“ Socket繁忙時注銷”或通知)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM