2017-02-23 4 views
1

Ich versuche, ein einfaches Programm mit einem Server und einem Client zu erstellen, wobei Textstrings hin und her geleitet werden. Ich habe Probleme, die Verbindung herzustellen. Ich habe eine Testdruckzeile direkt unter der Socket-Accept-Zeile und es wird nie gedruckt, also nehme ich an, dass das Problem dort ist, aber ich bin nicht sicher, wie man eine gründlichere Überprüfung durchführt.Fehler beim Akzeptieren der Socket-Verbindung in Java

Ich habe dieses Programm in Eclipse geschrieben, wenn das einen Unterschied macht. Diese

ist der Server:

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

public class HW2Q1S { 

public static void main(String[] args) throws Exception { 

    try { 
     //connection 
     ServerSocket srvr = new ServerSocket(7654); 
     Socket skt = srvr.accept(); 
     System.out.println(skt.getPort()); 

     //data xfer 
     BufferedReader sIn = new BufferedReader(new InputStreamReader(skt.getInputStream())); 
     PrintWriter sOut = new PrintWriter(skt.getOutputStream(), true); 

     //string receiving 
     int count = 1; 
     String msg = ""; 

     while((msg = sIn.readLine()) != null) { 
      while(count < 11) { 
       msg = sIn.readLine(); 
       System.out.println("Received: "+ msg); 
       String returnMsg = msg.toUpperCase(); 
       System.out.println("Capped: "+ returnMsg); 
       sOut.write(returnMsg); 
       count++; 
      } 
     } //end of read from client in while loop 
     if (count == 10) { 
      System.out.println("Max reached."); 
     } 
     srvr.close(); 
     return; 
    } 

    catch(Exception e) { 
     System.out.println("Error caught: " + e); 
    } 

} // end of main 
} // end of class 

Und dies ist der Kunde:

import java.util.Random; 
import java.io.*; 
import java.net.*; 

public class HW2Q1C { 

public static void main(String[] args) throws IOException { 

    String capped = ""; 
    String temp = ""; 

    try { 
     //make the connection 
     Socket skt = new Socket("localhost", 7654); 
     BufferedReader cIn = new BufferedReader(new InputStreamReader(skt.getInputStream())); 
     PrintWriter cOut = new PrintWriter(skt.getOutputStream(), true); 

     //send 11 strings 
     for (int i = 0; i < 11; i++) { 
      temp = Stringer(); 
      cOut.write(temp); 
      System.out.println("Sending: " + temp); 

     } 

     //receive server strings 
     while(cIn.readLine() != null) { 
     capped = cIn.readLine(); 
     System.out.println("From server: "+ capped); 
     } 

     skt.close(); 
    } // end of connection try block 

    catch(Exception e) { 
     System.out.print("Whoops! It didn't work!\n"); 
    } 

} //end of main 

static String Stringer() { 
    String msg, alpha; 
    msg = ""; 
    alpha = "abcdefghijklmnopqrstuvwxyz"; 
    Random rnd = new Random(); 
    for (int i = 0; i < 10; i++) { 
     msg += alpha.charAt(rnd.nextInt(25)); 
    } 
    return msg; 
} 
} //end of class 

Dank!

+1

Ich denke, eine Ausnahme tritt auf, was ist der Stacktrace? Hast du versucht es zu debuggen? – Altoyyr

+0

Das habe ich mir gedacht, aber in der Konsole ist nichts. Es ist komplett leer. – TurtleOrRodeo

+1

Ich habe gerade Ihr Programm ausgeführt und soweit ich sehen kann, ist die Verbindung selbst in Ordnung. srvr.accept() wartet, bis ein Client eine Verbindung herstellt (was es richtig macht) Vielleicht ist das eine zusätzliche Hilfe http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html – Altoyyr

Antwort

2

Ich glaube, ich habe dein Problem gefunden.
Sie sollten println statt write verwenden. Ich bin mir ziemlich sicher, das Problem ist, dass schreiben keine tatsächliche Zeile sendet string + \n und daher kann der Server eine Zeile nicht lesen.
ich geändert Ihr Beispiel ein wenig leichter zu testen und verständlich zu machen, aber das funktioniert für mich:

Server:

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

public class Server { 
    public static void main(String[] args) throws Exception { 
     try { 
      //connection 
      ServerSocket srvr = new ServerSocket(7654); 
      Socket skt = srvr.accept(); 
      System.out.println(skt.getPort()); 

      BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream())); 

      String msg = ""; 
      while ((msg = in.readLine()) != null) { 
       System.out.println("Received: " + msg); 
      } //end of read from client in while loop 
      srvr.close(); 
     } catch (Exception e) { 
      System.out.println("Error caught: " + e); 
     } 

    } // end of main 
} // end of class 

Auftraggeber:

import java.util.Random; 
import java.io.*; 
import java.net.*; 

public class Client { 

    public static void main(String[] args) throws IOException { 
     try { 
      Socket socket = new Socket("localhost", 7654); 
      PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

      for (int i = 0; i < 11; i++) { 
       out.println(Stringer()); //<-- println instead of write 
      } 
      socket.close(); 
     } // end of connection try block 
     catch(Exception e) { 
      System.out.print(e.toString()); 
     } 

    } //end of main 

    static String Stringer() { 
     String msg, alpha; 
     msg = ""; 
     alpha = "abcdefghijklmnopqrstuvwxyz"; 
     Random rnd = new Random(); 
     for (int i = 0; i < 10; i++) { 
      msg += alpha.charAt(rnd.nextInt(25)); 
     } 
     return msg; 
    } 
} //end of class 

SERVER:

Empfangen: scnhnmaiqh
Empfangen: tuussdmqqr
empfangen: kuofypeefy
empfangen: vghsinefdi
empfangen: ysomirnfit
empfangen: lbhqjfbdio
empfangen: qhcguladyg
empfangen: wihrogklfi
empfangen: tipikgfvsx
empfangen: fmpdcbtxqb
empfangen: yujtuefqft

+0

Das hat es, vielen Dank! – TurtleOrRodeo

Verwandte Themen