2016-05-09 11 views
0

Das ist mein Server-Klasse, die einen Server-Socket öffnet Informationen von einem Klienten zu erhalten und verwendet dann die Klasse Benutzer den String für alle Benutzer in der Gruppe zu senden:Warum schreibt der Server nicht auf den Client?

public class Server { 
    static ServerSocket server; 
    static Socket client; 
    static DataOutputStream out; 
    static DataInputStream in; 
    static int port = 7767; 
    static Users[]User = new Users[10]; 

public static void main(String[] args)throws Exception{ 
    try { 
     System.out.print("starting"); 
     server = new ServerSocket(port); 
     while((client = server.accept())!= null){ 

      for(int i=0; i<10; i++){ 
       // System.out.println("input connection"); 
       out= new DataOutputStream(client.getOutputStream()); 
       in = new DataInputStream(client.getInputStream()); 
       if(User[i] == null) 
       { 
        User[i] = new Users(out, in, User); 
        Thread thread = new Thread(User[i]); 
        thread.start(); 

       } 
      } 
     } 

      } catch (IOException e) { 

       e.printStackTrace(); 


} 

Diese Benutzerklasse hält nur Informationen, die ist ein Client und sendet dann allen Benutzern die Zeichenfolge, die der Server gesendet wurde, ich nutzte eine NullPointException für message = in.readUTF();, aber jetzt passiert überhaupt nichts.

public class Users implements Runnable { 
DataOutputStream out; 
DataInputStream in; 
Users[] User = new Users[10]; 
public Users(DataOutputStream out, DataInputStream in, Users[] User) 
{ 
    this.in = in; 
    this.out = out; 
    this.User = User; 

} 
public void run(){ 
    while(true){ 
     try{ 
      BufferedReader bri = new BufferedReader(new InputStreamReader(in)); 

     String message; 
     message = bri.readLine(); 

      for(int i=0; i<10; i++){ 
       if(User[i] != null) 
      { 
        BufferedWriter br = new BufferedWriter(new OutputStreamWriter(out)); 
       User[i].br.write(message + "\n"); 
       } 

      } 

     } 
     catch(IOException e){ 
    // catching and doing something about it and stuff 
     } 

} 
}` 

Auftraggeber:

public class Client implements WriteGui { 
static Socket client; 
static DataInputStream in; 
static DataOutputStream out; 
JTextArea msgout; 
private JFrame frame; 
private JTextField msgA; 
private JTextField nameA; 



/** 
* Create the application. 
*/ 
public Client() { 
    initialize(); 
    CStart(); 
}` 

    public void actionPerformed(ActionEvent arg0) { 
      if(nameA.getText() == ""){ 
      nameA.setText(getname()); 


      } 
      String message; 

      message = (nameA.getText()+": "+ msgA.getText()); 

     try { 
       BufferedWriter br = new BufferedWriter(new OutputStreamWriter(out)); 
       br.write(message+"\n"); 


      } catch (IOException e) { 
      msgout.append("error!"); 

      } 


     } 
public void write(String s) { 
    msgout.append(s+ "/n"); 

} 
private String getname(){ 
    return JOptionPane.showInputDialog(frame,"fill out name" , "name", JOptionPane.QUESTION_MESSAGE); 



} 
public void CStart(){ 
int port = 7767; 
    String host = "localhost"; 
    try { 

    client = new Socket(host, port); 
    msgout.append("starting"); 
    in = new DataInputStream(client.getInputStream()); 
    out = new DataOutputStream(client.getOutputStream()); 
    Input input = new Input(in, this); 
    Thread thread = new Thread(input); 
    thread.start(); 

    } 

    catch(Exception e) { 
     msgout.append("error"); 
    } 

Ich habe auch eine kurze Eingangsklasse (minus alle swing Sachen Frage um Platz zu sparen), der die Nachrichten in den Client-Eingänge:

public class Input implements Runnable { 
WriteGui gui; 
DataInputStream in; 
static BufferedReader br; 
public Input(DataInputStream in, WriteGui gui){ 
    this.in = in; 
    this.gui = gui; 

} 

public void run() { 
    String message; 
br = new BufferedReader(new InputStreamReader(in)); 
try { 
    message = br.readLine(); 
    gui.write(message); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

wie Ich sagte, ich habe den Fehler auf die Klasse Benutzer zurückverfolgt, aber die NullPointerException ist nicht garantiert jedes Mal passieren. Es scheint immer noch im Server/Users-Code zu sein, da es mehr Ressourcen benötigt. Kann mir jemand helfen herauszufinden, warum dieser Datainputstream nicht zu funktionieren scheint?

Bearbeiten: Es beendet die Produktion NullPointerException, und jetzt nach dem Start nach mehreren Versuchen statt der Nachricht zu drücken, sendet es eine Box-Form. Es scheint also ein Problem mit dem UTF-Lesen zu sein. Selbst wenn Sie den OutputStreamWriter auf einen DataInputStream umstellen, wird er nicht funktionieren.

+0

Stacktrace, bitte? –

+0

Ich denke, das Problem ist, dass Sie die Daten schreiben mit einem 'OutputStreamWriter' und Sie versuchen, es mit einem' DataInputStream' zu lesen. Versuchen Sie, den gleichen Datenstromtyp zum Schreiben/Lesen der Daten zu verwenden. – Titus

+0

Ich habe versucht, nur mit dem DataInputStream und es hat nicht funktioniert, weshalb ich es nachgeschlagen und jemand hatte den OutputStreamWriter für ein ähnliches Problem vorgeschlagen – Alexandre

Antwort

1

Damit die Methode readUTF() funktioniert, müssen die Daten auf eine bestimmte Weise formatiert werden, was nicht der Fall ist, wenn Sie sie mit einem OutputStreamWriter schreiben.

Ich schlage vor, Sie BufferedReader verwenden und eine BufferedWriter, verwenden write(string+"\n") etwas und readLine() zu lesen, um zu schreiben. Damit dies funktioniert, müssen Sie am Ende jeder Nachricht eine neue Zeile \n hinzufügen. Hier

ein Beispiel:

try(BufferedWriter bw = new BufferedWritter(new OutputStreamWriter(socker.getOutputStream()))){ 
    bw.write(message + "\n"); 
}catch(IOException e){ 
    e.printStackTrace(); 
} 


try(BufferedReader br = new BufferedReader(new InputStreamReader(socker.getInputStream()))){ 
    String message = br.readLine(); 
}catch(IOException e){ 
    e.printStackTrace(); 
} 
+0

Würdest du vorschlagen, das mit beiden Seiten des Streams zu tun? – Alexandre

+0

@Alexandre Ja, Sie sollten den gleichen Lesertyp wie den Schreiber verwenden. Und wenn Sie die Daten Zeile für Zeile (mit 'readLine()') lesen, stellen Sie sicher, dass Sie Ihre Nachrichten mit einem neuen Zeilenzeichen '\ n' beenden. – Titus

+0

Das ist seltsam. Ich habe es gerade ein paar Mal mit diesem Vorschlag getestet, und es hat nicht geholfen. Die Box und andere seltsame Symbole, die ich bekommen habe, sind weg, aber die gesendete Nachricht ist nicht aufgetaucht. – Alexandre

1

Wie Sie jetzt ein BufferedWriter verwenden, müssen Sie es zu geeigneten Zeiten flush(), das heißt, wenn Sie vom Schreiben zum Lesen wechseln.

+0

okay. Könntest du nett genug sein, ein Beispiel zu geben oder mich irgendwo anders zu zeigen? weil ich annehme, dass ich es synchronisieren muss oder Zeit es als ob ich gerade den Schreiber lege es tun kann, bevor der Ausgangsstrom vom Server erhalten wird? – Alexandre

+0

Sie benötigen kein Beispiel für eine Codezeile. Erstelle keine imaginären Probleme. Spülen Sie es einfach, bevor Sie lesen. Das ist nicht schwer. Ich kann den Teil nach "wegen" nicht verstehen. – EJP

+0

Ich bekomme eine NullPointerException erneut, wenn ich den Code mit einem Flush ausführen, nachdem ich die Nachricht an den Server gesendet habe, und a bekomme ich auch den Ausnahmefehler, wenn ich den Stream sofort nachdem ich die Nachricht zurück an den Client senden flush. – Alexandre

Verwandte Themen