2011-07-21 3 views
0

J'écris un programme Java qui doit accepter en continu des objets sérialisés tout au long de l'exécution de l'application. Les objets sont envoyés par un serveur comme demandé par l'utilisateur.Client TCP acceptant des objets

Mon application principale initialise le client tcp (extension thread) dans sa méthode d'exécution, mais j'essaie de lire les objets de la ligne à partir d'une fonction.

pseudocode suit:

*tcp client extends thread 

*global vars: ip, port, socket, oi stream, oo stream, object reference 

*run() 
     make connection 

*getObject() 
     object reference = (object).readobject() 
     return object 

Ma principale application appelle client.getObject() dans une boucle de mise à jour. il peut y avoir ou non un objet en attente.

Est-ce que je vais dans le mauvais sens?

+0

Veuillez indiquer le nombre de clients; cycle de vie de la connexion; une sémantique de connexion (par exemple basée sur la session ou non); et la taille moyenne de la charge utile. Enfin (important) adresse maximisant quel latence ou débit est votre objectif. – alphazero

Répondre

1

Essayez-vous de faire un comportement de serveur «classique» ou des E/S non bloquantes? Si c'est la première, je recommanderais une file d'attente de blocage sur le serveur pour accepter les demandes entrantes et un groupe de threads pour les traiter. Demandez au serveur d'attribuer un thread pour traiter la requête quand elle arrive jusqu'à ce que le pool de threads soit épuisé; Mettre en file d'attente les requêtes jusqu'à ce que les threads soient libérés et renvoyés au pool.

Les E/S non bloquantes sont entièrement différentes. Regardez comment Netty et node.js sont conçus et mis en œuvre pour cela.

Je n'aurais jamais de classe étendre Thread - il est peu probable que vous ajouterez un nouveau comportement significatif. Implémentez Runnable à la place et donnez-le à une instance Thread pour exécuter.

+0

J'ai lu que le runnable est le meilleur moyen d'y aller, merci pour les conseils. – emily

+1

@duffymo: comment pourriez-vous proscrire tout cela sans même un minimum d'intrants quant au scénario d'utilisation, au nombre de clients, à la durabilité de la connexion, etc.? Et jeter NIO au réseau Java newbees va probablement causer beaucoup plus de confusion que de perspicacité. [2c/ton doux] – alphazero

0

Je suggère que votre méthode run() lit tous les objets et les ajoute à une file d'attente. getOject() prend l'objet suivant de la file d'attente. Vous pouvez également avoir un int queueLength() pour vérifier comment vous attendez.

+1

merci beaucoup! – emily