2016-04-25 10 views
-2

Ich schreibe ein Chat-Programm in Java. Ich kann anscheinend keine Nachrichten senden können. Meine ClientConnectionHandler behandelt eine Instanz von jedem Clientkann keine Nachrichten im Chat-Programm senden

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


public class ClientConnectionHandler extends Thread { 



private Socket socket; 
String username; 
private UUID id; //= UUID.randomUUID(); 
BufferedReader reader; 
PrintWriter writer; 
private final HashMap<UUID, ClientConnectionHandler> clients = new HashMap<>(); 
volatile boolean messageLoop = true; 

ServerGUI serverGUI; 

public ClientConnectionHandler(Socket socket){ 
    this.socket = socket; 
    try{ 
     this.socket.setSoTimeout(1000); 
    } 
    catch (SocketException e) { 
     System.out.println(e); 
    } 

    try { 

     reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); 
    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

public void run(){ 
    if (socket != null && reader != null) { 
     addToClients(); 
     try { 
      String messageInput; 
      while (messageLoop){ 
       try{ 
        messageInput = reader.readLine(); 
        sendMessage(messageInput); 
       } 
       catch(SocketTimeoutException ste){ 
        //Thread.yield(); 
       } 
      } 
     } 
     catch (IOException e){ 
      e.printStackTrace(); 
     } 
     finally { 
      removeFromClients(); 
      try { 
       reader.close(); 
       writer.close(); 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
    } 

    else { 
     System.out.println("Socket connection and BufferedReader are closed"); 
    } 
} 
private void sendMessage(String msg){ 
    for (ClientConnectionHandler cchandler : clients.values()){ 
     try { 
      //if (!clientconn.id.equals(this.id)) { 
       cchandler.writer.write(msg+"\n"); 
       cchandler.writer.flush(); 
      //} 
     } 
     catch (Exception e){ 
      System.err.println("Unable to write to client"); 
      clients.remove(cchandler.id); 
     } 
    } 
} 

} 

Hier ist meine Client Klasse

public class Client { 
    private Socket clientSocket; 
    private String username; 
    private static int port = 7777; 
    BufferedReader inReader; 
    PrintWriter outWriter; 
    private SimpleDateFormat sdf; 
    ClientGUI clientGUI; 
    ServerGUI serverGUI; 
    private Login login; 

    public Client(String username, int port){ 
     this.username = username; 
     this.port = port; 
     sdf = new SimpleDateFormat("dd.MM.yyyy 'at' hh:mm:ss a"); 
    } 

    /** 
    * Connects the client to the Server 
    */ 
    public void connectClient(){ 
     try{ 
      clientSocket = new Socket("127.0.0.1", port); 
      Thread thread = new Thread(new ClientConnectionHandler(clientSocket)); 
      thread.start(); 
      String connected = sdf.format(new Date())+"\n"+username+" just connected \n"; 
      System.out.println(connected); 
     } 
     catch(Exception e){ 

      System.out.println(sdf.format(new Date())+"\n"+username+" did not connect to server "+e+"\n"); 
     }  
    } 

    /** 
    * Disconnects the Client from the Server 
    */ 
    void disconnectClient(){ 
     try{ 
      clientSocket.close(); 
      System.out.println(username+" disconnected \n"); 
     } 
     catch(Exception e){ 
      System.out.println(username+" failed to disconnect \n"); 
     } 
    } 


    //send message to the server 
    public void sendMessage() throws IOException{ 
     try{ 
      inReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
      outWriter = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 
     } 
     catch(IOException ioe){ 

     } 

     //infinite loop to check for messages 
     try{ 
      String response; 
      String inputMsg = inReader.readLine(); 
      outWriter.println(inputMsg);  
      while((response = inReader.readLine()) != null){ 
       System.out.println(response); 
       outWriter.println(inputMsg); 
      } 
      inReader.close(); 
      outWriter.close(); 
      //clientGUI.appendMessage(inputMsg); 
     } 
     catch(IOException ioe){ 

     } 
    } 

    void appendToCG(String str){ 
     clientGUI.appendMessage(str); 
    } 

    public static void main(String[] args) { 
     Client client = new Client("127.0.0.1",port); 
    } 

} 

EDIT

startServerConnection() Methode in meiner Server Klasse:

public void startServerConnection() 
    { 
     try { 
      serverSocket = new ServerSocket(portNumber); 

      while(connection){ 
       System.out.println("Waiting for a client..."); 
       Socket clientSocket = serverSocket.accept(); 
       System.out.println("Server connection established on port: "+clientSocket.getLocalPort()); 
       ClientConnectionHandler clientConnection = new ClientConnectionHandler(clientSocket); 
       Thread thread = new Thread(clientConnection); 
       thread.start(); 
      } 
     } 
     catch (Exception e) { 
      // System.out.println(sdf.format(new 
      // Date())+": Server didn't connect"); //append to eventsLog 
      e.printStackTrace(); 
      return; 
     } 
    } 

Ich bin mir ziemlich sicher, dass ich alle erforderlichen Leser und Schreiber erstellt habe, sowohl auf der ClientConnectionHandler (für jeden Benutzer eine Nachricht senden) und Client, Nachrichten zu lesen. Verpasse ich etwas?

+1

ich hier überall um keinen 'ServerSocket' sehen ... – 3kings

+0

@ 3Kings posted ich einen Teil meiner 'Server' Klasse Irgendwelche Ideen? – Guest1235

+0

Bitte vandalisiere deine Posts nicht. Klicken Sie bitte auf Löschen, um den Beitrag zu löschen, wenn Sie ihn löschen möchten. –

Antwort

1

Wahrscheinlich nicht die volle Auflösung, aber:

  1. Die ClientConnectionHandler erstreckt Thread. Es sollte wahrscheinlich Runnable erweitern, da Sie in startServerConnection() einen Thread erstellen.

  2. Es sieht so aus, als ob Sie versuchen, den ClientConnectionHandler zwischen Server und Client wiederzuverwenden. Dieser Ansatz ist möglicherweise nicht das, was Sie wollen. Mehr als wahrscheinlich wollen Sie eine andere Runnable für den Client. Ich habe nicht durch all die Auswirkungen gedacht, aber Sie könnten die Client Klasse implementieren Runnable, um der Lage sein, und dann die Client

    public void connectClient(){ 
    try{ 
        clientSocket = new Socket("127.0.0.1", port); 
        // set a timeout here, or you will block the IO! Alternatively, 
        // use the NIO stuff 
        Thread thread = new Thread(this); 
        thread.start(); 
        String connected = sdf.format(new Date())+"\n"+username+" just connected \n"; 
        System.out.println(connected); 
    } 
    catch(Exception e){ 
    
        System.out.println(sdf.format(new Date())+"\n"+username+" did not connect to server "+e+"\n"); 
    }  
    } 
    
    public void run() { 
        try { 
         clientSocket.setSoTimeout(1000); 
    
         //loop to read messages sent to *this* client 
         while (true) { 
         try { 
          String inputMsg = reader.readLine(); 
          // just print to stdout; might want to update some GUI 
          System.out.println(inputMsg); 
         } 
         catch (SocketTimeoutException noop) { } 
         } //end of while loop 
        } 
        catch (Exception e) { 
         // note that this error may not be a problem since 
         // disconnect client will close the socket, which will 
         // cause an error at some future point. 
         System.err.println(e); 
        } 
    
        } 
    } 
    
  3. Im Client.sendMessage() Methode ändern:
    ein. Welche Nachricht möchten Sie senden? Sie müssen Eingaben von irgendwo sammeln
    b. Schließen Sie die Streams in der Methode nicht an und schließen Sie sie nicht.

  4. So vermutlich in der Client Klasse, die Sie benötigen, wie etwas zu tun ist:

    public void sendMessage() throws IOException{ 
        try{ 
        // get the message to send from somewhere 
        String msgToSend = "foo"; // just dumb text; replace with actual 
        writer.write(msgToSend); 
        writer.write("\n"); // often needed 
        writer.flush(); // flush the buffer 
        } 
    
    } 
    
+0

können wir uns in einem Raum darüber unterhalten? Ich weiß, wie man seinen Code implementiert, aber es gibt ein paar Sachen, die mir nicht sicher sind, und ich möchte keine Debatte über den Kommentarbereich beginnen. – Guest1235

+0

Ich würde Sie brauchen, um einen Raum zu schaffen, da ich nicht genug Reputation habe – Guest1235

+0

Ja, ich bin neu hier. Ich weiß nichts über Chat Rooms. – JohnDorrian

Verwandte Themen