2010-06-30 4 views
1

L'exception est renvoyée à la ligne 24 la deuxième fois que je tape quelque chose (après avoir tapé le nom d'hôte) - le serveur fonctionne correctement. Je suis nouveau en Java, donc il me manque quelque chose d'évident je suppose. lit Exception:java DataOutputStream exception

exception de thread "main" java.net.SocketException: Logiciel provoqué abandon de la connexion: socket écriture erreur à java.net.SocketOutputStream.socketWrite0 (Méthode natif) à java.net .SocketOutputStream.socketWrite (SocketOutputStream.java:92) à java.net.SocketOutputStream.write (SocketOutputStream.java:115) à java.io.DataOutputStream.writeBytes (DataOutputStream.java:259) à TCPclient.main (TCPClient .java: 52) Java Résultat: 1

Serveur:

import java.io.*; 
import java.net.*; 

class TCPServer { 
    public static void main(String argv[]) throws Exception { 
     String clientSentence; 
     ServerSocket welcomeSocket = new ServerSocket(44444); 
     while(true) { 
     Socket connectionSocket = welcomeSocket.accept(); 
     BufferedReader inFromClient = new BufferedReader(
       new InputStreamReader(connectionSocket.getInputStream())); 
     clientSentence = inFromClient.readLine(); 
     System.out.println(clientSentence + "\n"); 
     } 
    } 
} 
+0

Connexes: http://stackoverflow.com/questions/2126607/official-reasons-for-software-caused-connection-abort-socket-write-error – BalusC

+0

Merci - Je pense que ça doit être quelque chose de plus simple dans mon cas - le "serveur" reçoit toujours la première chaîne que je tape et je reçois une exception sur la seconde - ce n'est pas que je mélange mes cordes ou quoi que ce soit –

+0

@dardana: C'est très difficile de savoir ce qui se passe sans aucune idée de ce qu'est le serveur. –

Répondre

4

Votre client crée un socket et écrasera et encore à celle d'une prise. Votre serveur, d'autre part, le fait:

ServerSocket welcomeSocket = new ServerSocket(44444); 
while(true) { 
    Socket connectionSocket = welcomeSocket.accept(); 

qui accepte la connexion entrante, lit une ligne, et abandonne alors (et je devine sur Finaliser de la prise lors de leur ramasse-miettes, il ferme la connexion). Ensuite, il attend une nouvelle connexion.

Donc, pour résoudre votre problème immédiat, essayez de

Socket connectionSocket = welcomeSocket.accept(); 
    BufferedReader inFromClient = new BufferedReader(
      new InputStreamReader(connectionSocket.getInputStream())); 

avant que la boucle while.

+0

Merci en effet - je suis un débutant et ça se voit :) Je vais essayer ce que vous dites –

+0

Oui - fonctionne !!! Donc la connexion était fermée - c'est pourquoi j'ai eu l'exception? –

+0

C'est vrai. Le point de terminaison du serveur a abandonné la connexion et a cessé de la lire. Rappelez-vous qu'une socket serveur a la capacité d'accepter les connexions entrantes à partir de multiples sockets client. Une fois que vous avez accepté une connexion via 'accept', le socket récupéré est persistant (grâce à la magie de TCP/IP). Il n'est pas nécessaire de rétablir la connexion chaque fois que vous souhaitez envoyer des données sur la ligne. –

1

Combien de temps attendez-vous entre la saisie de la deuxième ligne? Cela pourrait avoir quelque chose à voir avec le socket étant inactif.

Aussi avec le code du serveur comme celui-ci, vous verrez seulement le premier message. Essayer ceci:

import java.io.*; 
import java.net.*; 

class TCPServer { 
    public static void main(String argv[]) throws Exception { 
     String clientSentence; 
     ServerSocket welcomeSocket = new ServerSocket(44444); 
     Socket connectionSocket = welcomeSocket.accept(); 
     BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
     while (true) { 
      clientSentence = inFromClient.readLine(); 
      System.out.println(clientSentence + "\n"); 
     } 
    } 
} 
+0

Merci beaucoup - Je vais essayer vos suggestions immédiatement - merci –

+0

Fonctionne - merci - ce n'est pas le socket étant inactif mais la fermeture de la connexion (???) –

+0

J'ai tendance à être d'accord avec Mark Peters: Vous avez simplement abandonne toutes les références au socket serveur après avoir reçu le premier message. À un certain point, le socket sera fermé et vous obtiendrez l'exception. –

0

Essayer:

while (true) 
{ 
    if(inFromUser.readLine() != null) 
    {   
     msg = inFromUser.readLine(); 

     System.out.println(msg); 
     if (msg.equals("exit")) 
     { 
      System.out.println("exit"); 
      break; 
     } 

     outToServer.writeBytes(cAddress + " said : " + msg + "\n"); 
    } 
} 

Remarque: les changements

if(inFromUser.readLine() != null) 
{ 

et

... "\n"); 

pas

... '\n'); 

Faites un essai. C'est probablement une solution trop simple, mais c'est quelque chose :)

+0

L'envoi de la deuxième ligne de chaque deux lignes et la conversion du caractère littéral en chaîne littérale n'aideront pas le problème de socket dont j'ai peur. –