2010-07-15 4 views
0

J'ai créé une classe générique 'SocketServer' en Java qui prend les arguments suivants: adresse String, int port, classe socketProtocol, String EncryptionType, int backlogSizeAide à la conception appropriée pour Socket générique serveur

Fondamentalement, Je veux que d'autres développeurs puissent utiliser cette classe dans leurs projets et définir des options simples pour le cryptage, le backlog, l'adresse, le port. A partir de là, ils doivent concevoir le protocole. SocketProtocol est une interface qui active sendMessage et receiveMessage (avec quelques autres). À ce stade, l'utilisateur de la classe doit simplement implémenter SocketProtocol et transmettre la classe (c'est-à-dire MySocketProto.class) à l'instance de SocketServer, qui à son tour, une copie du protocole pour chaque connexion entrante via .newInstance ()

Est-ce que cela a du sens? Existe-t-il un moyen plus simple d'établir ce type de fonctionnalité? Je n'aime pas l'idée de passer le type de classe au serveur, cela semble étrange.

Merci à tous, Chris

Répondre

1

j'utiliser le Factory pattern dans cette situation. L'exemple lié Wikipedia est un peu bavard, mais il peut être très simple:

public interface ISocketProtocolFactory { 
    ISocketProtocol buildProtocol(); 
} 

Votre constructeur SocketServer alors prendre une instance de quelque chose ISocketProtocolFactory la mise en œuvre, et de lui demander de nouveaux ISocketProtocol s comme il va. Cela donnera à vos utilisateurs beaucoup plus de flexibilité dans la construction des instances ISocketProtocol, en prenant soin de la 'méchanceté' d'avoir un paramètre de classe.

+0

I comme cette idée .. et il prend soin du paramètre de classe. Donc, permettez-moi de le dire, est-ce que les implémentations de ISocketProtocolFactory implémenteraient l'implémentation de ISocketProtocol par l'utilisateur, puis retourneraient l'objet instancié? –

+0

C'est vrai. Vous pouvez même ajouter des paramètres à 'buildProtocol', et l'utilisateur peut retourner différentes implémentations de' ISocketProtocol' dans certains scénarios. Mais dans la plupart des cas, c'est simplement 'return new MySocketProtocol()'. –

+0

Sweet. Merci. On dirait que le modèle de conception d'usine correspond aux exigences. Je le connais, mais je n'ai pas pensé à l'utiliser pour cette situation! –

0

Je suppose que chaque port aurait son propre protocole. Dans cet esprit, vous le spécifier pour le port.

La façon dont je l'avais fait dans le passé est d'avoir les implementors passent dans une classe qui hérite de:

public Interface ProtocolInterface 
{ 
    public void serve(InputStream in, OutputStream out) throws IOException 
... 

où le InputStream et OutputStream sont les entrées et les sorties à la prise