JAVA将套接字包装为多屏幕Swing应用程序中的单例类
我正在用JavaSwing编写一个聊天应用程序,它有一个自定义协议和使用套接字的服务器后端。我正在制作客户端连接处理程序。以下是我到目前为止的代码: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
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