2013-09-26 3 views
1

tout le monde! J'essaie de faire ma première application Java en utilisant Sockets. Et j'ai de la difficulté à lire depuis Socket. est ici un code source pour un ServerThread:Impossible de lire à partir de Socket

public class ServerThread extends Thread{ 
private final int SERVER_PORT = 444; 
private ServerSocket serv; 
public ServerThread(){ 

    try { 
     serv = new ServerSocket(SERVER_PORT); 
    } catch (IOException ex) { 
     Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

@Override 
public void run(){ 
    while(true){ 
     try { 
      Socket client = serv.accept(); 
      client.setSoTimeout(0); 
      client.setTcpNoDelay(true); 
      client.setSendBufferSize(65536); 
      if(client.isConnected()){ 
       new Thread(new MsgSrv(client)).start(); 
       System.out.println("Client connected"); 
      } 
     } catch (IOException ex) { 
      Logger.getLogger(ServerThread.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 
} } 

Et est là pour une classe, qui gère les connexions clientes:

public class MsgSrv extends Thread{ 
private BufferedWriter out; 
private BufferedReader in; 
private boolean isFinished = false; 
private String buff; 
private Socket sock; 
public MsgSrv(Socket sc){ 
    try { 
     sock = sc; 
     in = new BufferedReader(new InputStreamReader(sc.getInputStream())); 
     out = new BufferedWriter(new OutputStreamWriter(sc.getOutputStream())); 
    } catch (IOException ex) { 
     Logger.getLogger(MsgSrv.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 
public void run(){ 
    while(!isFinished){ 
     try { 
      buff=in.readLine(); 
      System.out.println(buff); 
      out.write("Hello"); 
     } catch (IOException ex) { 
      Logger.getLogger(MsgSrv.class.getName()).log(Level.SEVERE, null, ex); 
      isFinished=true; 
     } 
    } 
}} 

application client envoie une chaîne à un serveur, et d'essayer de lire une réponse . Mais rien ne se passe. in.readLine ne renvoie rien et attend une réponse d'un serveur pour toujours. Pouvez-vous m'aider à résoudre un problème? Pour lire des données, j'ai déjà utilisé des classes DataInputStream, BufferedReader. Source pour une application client:

public class JavaApplication4 { 

/** 
* @param args the command line arguments 
*/ 
public static Socket connectSock; 
public static PrintWriter out; 
public static DataInputStream in; 
public static void main(String[] args) { 
    try { 

     connectSock = new Socket("127.0.0.1", 444); 
     if(connectSock.isConnected()){ 
      in = new DataInputStream(connectSock.getInputStream()); 
      out = new PrintWriter(connectSock.getOutputStream(), true); 
      out.println("!hello!"); 
      out.flush(); 
      String s; 
      while(true){ 
       s = in.readUTF(); 
       System.out.println(s); 
      } 

       }else 
     { 
      System.out.println("bad socket"); 
      System.exit(0); 
     } 
    } catch (UnknownHostException ex) { 
     Logger.getLogger(JavaApplication4.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(JavaApplication4.class.getName()).log(Level.SEVERE, null, ex); 
    } 

}} 
+0

Les tests 'isConnected()' sont tous deux inutiles. La prise ne peut éventuellement pas être connectée à ces points. – EJP

+0

Il n'y a pas de problème avec la méthode isConnected. Le serveur reçoit une chaîne du client et l'imprime sur une console. Mais le client ne peut pas recevoir une chaîne d'un serveur. – balamutik

+0

Ma remarque était un commentaire, pas une réponse. Appeler cette méthode à ces endroits reste inutile. N'écrivez pas de code inutile. Cela ne fait que confondre le problème. – EJP

Répondre

0

Comme vous utilisez l'objet PrintWriter à envoyer la chaîne utiliser l'objet Scanner pour lire la chaîne. Comme ça.

input = server.getInputStream(); 
Scanner scanner = new Scanner(input); 

while (scanner.hasNextLine()) { 
    s = (String) scanner.nextLine(); 
} 

modifier:

Si vous changez vous client comme cela et assurez-vous que vous avez une ligne de rupture à la fin de vous String ("\ n") lorsque vous utilisez scanner.nextLine();

if(connectSock.isConnected()){   
     Scanner scanner = new Scanner(connectSock.getInputStream()); 
     out = new PrintWriter(connectSock.getOutputStream(), true); 
     out.println("!hello!"); 
     out.flush(); 
     String s; 
     while (scanner.hasNextLine()) { 
      s = (String) scanner.nextLine(); 

     } 

      }else 
    { 
+0

Et toujours rien ne se passe ... – balamutik

+0

Etes-vous sûr qu'il y a une connexion? – JWqvist

+0

Oui, je suis sûr. Parce que le serveur reçoit la chaîne du client. – balamutik

Questions connexes