Java Programmation Socket
Je suis la construction d'une application client/serveur simple à l'aide de sockets java et d'expérimenter le ObjectOutputStream etc.
J'ai suivi le tutoriel à cette adresse http://java.sun.com/developer/technicalArticles/ALT/sockets partir de la moitié du chemin vers le bas quand il parle de transporter des objets sur les sockets.
Voir mon code pour le client http://pastebin.com/m37e4c577 Toutefois, cela ne semble pas fonctionner et je ne peux pas comprendre ce qui ne fonctionne pas. Le code en commentaire en bas est directement copié du tutoriel et cela fonctionne quand je viens de l'utiliser à la place de la création de l'objet client.
Peut-on voir rien de ce que je fais de mal?
Il n'y a pas d'erreur, il ne fonctionne tout simplement pas avec mon décommenté code et je ne vois pas pourquoi? Le code commenté des œuvres - je viens de séparation et de le placer dans un objet réel... ça me rend fou.
OriginalL'auteur Malachi | 2009-01-22
Vous devez vous connecter pour publier un commentaire.
Le problème est de l'ordre de la création du flux:
Dans le serveur de l'article (ce qui je suppose est ce que vous utilisez), lorsqu'une nouvelle connexion est ouverte, le serveur s'ouvre d'abord un flux d'entrée, puis un flot de sortie:
Le commentaire de l'exemple de code utilise l'ordre inverse, en établissant d'abord le flux de sortie, puis le flux d'entrée:
Mais votre code est-il dans l'autre sens:
L'établissement d'un flux de sortie/d'entrée de flux paire de décrochage jusqu'à ce qu'ils ont échangé leur serrer la main de l'information, de sorte que vous doit correspondre à l'ordre de la création. Vous pouvez le faire simplement en échangeant les lignes 34 et 35 dans votre exemple de code.
OriginalL'auteur Mike Houston
Vous n'êtes pas de l'écriture de l'objet n'importe où.
Voir que le lien de nouveau, quelque chose que vous avez à écrire:
Dans votre code, vous n'avez
C'est pourquoi
OriginalL'auteur OscarRyz
Juste un rappel.
Lorsque vous utilisez ObjectOutputStream garder à l'esprit qu'il garde une référence de cache. Si vous écrivez un objet, modifiez l'objet, le contenu, et ensuite envoyer le même objet nouveau, vous obtiendrez des données en double. Par exemple:
Produira dans le côté client deux listes à la chaîne "valeur1".
Pour éviter cela, la méthode de réinitialisation doit être appelé pour réinitialiser le cache de flux lors de l'écriture de la même référence de l'objet à plusieurs reprises:
OriginalL'auteur jassuncao
Probablement que vous les aimerez à apprendre les principes de base en premier.
Voici un exemple que je viens de coder.
Démarrez une serveur, qui ne s'occupe que d'UN seul client, et il envoie un objet et d'en mourir.
Lorsque l'utilisateur ( vous ), appuyez sur entrer, un nouveau client est créé, il se connecte sur le serveur et de lire l'objet que le serveur va envoyer.
Pas une exception est traitée ici. Juste pour rendre les choses plus simples, mais ce n'est PAS la voie de l'exception doit être traitée.
Lorsque vous comprendre tous les concepts, ici, il sera plus facile de comprendre ceux dans le tutoriel.
J'espère que cette aide.
OriginalL'auteur OscarRyz
Si vous avez essayé un débogueur, il aurait dit où était le problème.(Peut-être pas pourquoi)
Le problème que vous avez est que ObjectOutputStream écrit un en-tête et ObjectInputStream lit que d'en-tête. Vous avez créé le ObjectInputStream d'abord ce qui signifie qu'il est tentant de lire un en-tête qui ne sera jamais écrit.
Solution: Toujours créer la ObjectOutputStream premier et flush() avant de créer le ObjectInputStream.
OriginalL'auteur Peter Lawrey
C'est mieux d'ouvrir un
outputStream
car un flux de sortie ne sont pas bloquées. Ensuite, vous avez le flux d'entrée qui attend unStream
. Après tous les cours d'eau, de vous écrire dans le flux et le ras - la -outputStream.flush()
pour envoyer les octets de données. Vous aurez également besoin d'une méthode à l'autre extrémité à lire l'entrée, si c'est simplementinputStream.read()
qui lit chaque octet comme un entier pour unchar
, ou à l'aide d'unBufferedReader
ouScanner
. J'ai utilisé presque toutes les méthodes possibles, mais la méthode la plus efficace pour l'envoi estoutputStream.write(String)
qui écrit une séquence dechar
s commebyte
s dans le flux et la lectureinputStream.read()
lit une seulechar
. J'espère que cette aide.OriginalL'auteur kyle england