私は6つの異なるクラスに分けたサーバープロジェクトを持っています:
- ServerConnectionManager - このクラスは、他のすべてのクラスのハブになることができます
- 接続 - このオブジェクトは、クライアントが接続し、スレッドを開始するたびに作成されます
- ServerListner - これは、ユーザーからの入力をリッスンする Thread クラスです。
- ServerSender - これは、1 人以上のユーザーにメッセージを送信するクラスです
- ServerInformation - このクラスには、チャット担当者の 1 つと接続の 1 つの 2 つのリストが含まれます。このクラスでは、リストを検索して特定の人物や接続を見つけることもできます
- ChatPerson - このオブジェクトには、サーバーに接続する各ユーザーのユーザー名が含まれます
お察しのとおり、これはチャット プログラム用のサーバーです。
あなたへの私の質問は次のとおりです。
このプロジェクトでデザイン パターン (Mediator) を使用したいので、ServerConnectionManager には、各クラスが使用するすべての主要なメソッドが含まれています。たとえば、ServerInformation クラスの接続リストに接続を追加します。
しかし、ServerInformation クラスは、多くのメソッド (関数) しかなく、データの保存と検索以外の実際の目的がないため、オブジェクトと呼ぶことはできないため、静的にすることをお勧めしますか? または、計画に固執して、すべてが ServerConnectionManager を通過するようにする必要がありますか?
これが私のコードのサンプルです:
ServerConnectionManager
public class ServerConnectionManager {
private static ServerSocket server;
private static Socket connection;
private static ServerInformation ai = new ServerInformation();
private static boolean connected = false;
private static final int portNumber = 7070;
private static int backLog = 100;
/**
* This method launches the server (and the application)!
* @param args
*/
public static void main(String[] args){
startServer();
waitForConnection();
}
/**
*This method sets the serverSocket to portNumber and also adds the backLog.
*/
private static void startServer() {
try {
server = new ServerSocket(portNumber, backLog);
connected = true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* This method waits for a connection aslong as the serverSocket is connected.
* When a new client connects it creates an Object of the connection and starts the individual procedure.
*/
private static void waitForConnection() {
while (connected) {
try {
connection = server.accept();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Connection c = new Connection(connection);
addConnection(c);
waitForConnection();
}
}
public static void closeMe(Socket con) {
for (Connection conn : ai.getConnectionList()) {
if (conn.getConnection() == con) {
ai.getList().remove(ai.getList().indexOf(ai.getChatPersonByConnection(con)));
ai.getConnectionList().remove(conn);
System.out.println(ai.getList());
System.out.println(ai.getConnectionList());
conn.close();
break;
}
}
}
public static void addConnection(Connection con){
ai.addToConnectionList(con);
}
public static void addChatPerson(ChatPerson p){
ai.add(p);
System.out.println(ai.getList());
}
}
繋がり
public class Connection{
private Socket connection;
public Connection(Socket connection){
this.connection = connection;
ServerListner cl = new ServerListner(Connection.this);
cl.start();
}
public Socket getConnection(){
return this.connection;
}
public void close() {
try {
connection.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
サーバーリスナー
public class ServerListner extends Thread {
private Socket connection;
private BufferedReader br;
private ChatPerson person;
private Connection con;
private ServerInformation ai = new ServerInformation();
private ServerSender sender = new ServerSender();
public ServerListner(Connection con){
this.con = con;
connection = con.getConnection();
try {
br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Socket getConnection(){
return this.connection;
}
public void run(){
System.out.println(con.getConnection().isConnected());
try {
String inString;
while ((inString = br.readLine()) != null) {
if (inString.equalsIgnoreCase("Disconnect")) {
System.out.println(inString);
break;
}else {
processInput(inString);
}
}
ServerConnectionManager.closeMe(connection);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void processInput(String input){
if (input.equalsIgnoreCase("Connect")) {
sender.sendMessageToConnection(this.connection, "Accepted");
}
if (input.equalsIgnoreCase("UserInformation")) {
try {
String username = br.readLine();
person = new ChatPerson(username, connection);
ServerConnectionManager.addChatPerson(person);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (input.equalsIgnoreCase("SearchByCon")) {
String name = ai.searchByConnection(connection);
System.out.println(name);
}
}
}
サーバー送信者
public class ServerSender {
private PrintWriter pw;
private ServerInformation ai = new ServerInformation();
public void addToList(){
}
public void sendToAll(String message){
for (Connection c : ai.getConnectionList()) {
try {
pw = new PrintWriter(c.getConnection().getOutputStream());
pw.print(message);
pw.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
*
* @param con
* @param message
*/
/*
* Note - Denne metode gør også at jeg kan hviske til folk!:)
*/
public void sendMessageToConnection(Socket con, String message){
try {
PrintWriter print = new PrintWriter(con.getOutputStream());
print.println(message);
print.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
サーバー情報
public class ServerInformation{
private ArrayList<Connection> connectedClients = new ArrayList<Connection>();
private ArrayList<ChatPerson> list = new ArrayList<ChatPerson>();
public ArrayList<Connection> getConnectionList(){
return connectedClients;
}
public void addToConnectionList(Connection con){
connectedClients.add(con);
}
public String searchByConnection(Socket myConnection){
for (ChatPerson p : list) {
if (p.getConnection() == myConnection) {
return p.getName();
}
}
/*
* If none found!
*/
return null;
}
public ChatPerson getChatPersonByConnection(Socket myConnection){
for (ChatPerson p : list) {
if (p.getConnection() == myConnection) {
return p;
}
}
return null;
}
public void add(ChatPerson p){
list.add(p);
}
public void removeByName(String name){
for (ChatPerson p : list) {
if (p.getName().equalsIgnoreCase(name)) {
list.remove(p);
}
}
}
public String searchList(String name){
for (ChatPerson p : list) {
if (p.getName().equalsIgnoreCase(name)) {
return p.getName();
}
}
return null;
}
public ArrayList<ChatPerson>getList(){
return list;
}
}
チャットパーソン
public class ChatPerson {
private String chatName;
private Socket connection;
/*
* This is for furture development
* private Integer adminLevel;
*/
public ChatPerson(String name, Socket connection){
this.chatName = name;
this.connection = connection;
}
public void setName(String name){
this.chatName = name;
}
public String getName(){
return chatName;
}
public String toString(){
return "Username: "+chatName;
}
public Socket getConnection(){
return connection;
}
}
ちなみに、私は学生なので、私のコードを評価し、改善方法についての提案があればいいと思います(もしあれば:))