2016-05-02 11 views
-1

私は、クライアントまたはサーバーとして動作するオールインワンのJavaチャットプログラムを作成しています。私は現在、接続が確立された後に、プログラムが正常に受信した(または送信する)この問題を抱えています。私は迷惑メールのロードを介して迷惑メールにループを使用して、私はもう一方のメッセージがいくつかのメッセージを受け取ることに気づいた。手動で送信するメッセージは一度もありません。ここで コードです:いないすべてのメッセージが送信されている理由をJavaチャットアプリケーションで送信されたメッセージのみを受信します

public class ConnectionThread implements Runnable { 

private Connection c = Connection.getInstance(); 
private ChatInterface chatInterface; 
private static ConnectionThread serverThread; 
private ServerSocket serverSocket; 
private Socket socket; 
private ObjectInputStream dataIn; 
private ObjectOutputStream dataOut; 

public ConnectionThread() {} 

public static synchronized ConnectionThread getInstance() { 
    if (serverThread == null) { 
     serverThread = new ConnectionThread(); 
    } 
    return serverThread; 
} 

public void run() { 
    // If the programs role is server, set up the server 
    if (c.getRole() == ConnectionRole.SERVER) { 
     try { 
      setupServer(); 
      waitForConnection(); 
      setupStreams(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     do { 
      try { 
       chatInterface.addToChatHistory(dataIn.readUTF()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } while (c.getRole() == ConnectionRole.SERVER); 
    } 
    // If the programs role is client, set up a connection to the server 
    if (c.getRole() == ConnectionRole.CLIENT) { 
     try { 
      setupClient(); 
      setupStreams(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     do { 
      try { 
       chatInterface.addToChatHistory(dataIn.readUTF()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } while (c.getRole() == ConnectionRole.CLIENT); 
    } 
} 

private void setupClient() throws IOException { 
    System.out.println("ATTEMPTING TO CONNECT..."); 
    socket = new Socket("127.0.0.1", 8080); 
    System.out.println("CONNECTED!"); 
} 

private void setupServer() throws IOException { 
    System.out.println("SETTING UP SERVER.."); 
    serverSocket = new ServerSocket(8080, 1); 
    System.out.println("SERVER SETUP"); 
} 

private void waitForConnection() throws IOException { 
    System.out.println("WAITING FOR A CONNECTION..."); 
    socket = serverSocket.accept(); 
    System.out.println("CONNECTION RECIEVED"); 
} 

private void setupStreams() throws IOException { 
    System.out.println("SETTING UP STREAMS..."); 
    dataOut = new ObjectOutputStream(socket.getOutputStream()); 
    dataIn = new ObjectInputStream(socket.getInputStream()); 
    chatInterface = ChatInterface.getInstance(); 
    System.out.println("STREAMS SETUP"); 
} 

public void sendMessage(String message) throws IOException { 
    System.out.println("SENDING MESSAGE..."); 
    dataOut.writeUTF(message); 
    chatInterface.addToChatHistory(message); 
    System.out.println("MESSAGE SENT!"); 
} 
} 

誰が教えてもらえます/きちんと拾いましたか?私はかなり長い間それを試してきましたが、私は理由を理解できません。

+0

どこにメッセージを送信しますか。 – 3kings

+1

このコードは、送信したすべてを受信します。何かが受け取られなければ、あなたはそれを送らなかった。 'readUTF()'が 'EOFException'をスローするときは読み込みを止め、' ObjectInput/OutputStreams'は 'DataInput/OutputStreams'で十分です。 – EJP

+0

メッセージは、下部のsendMessageメソッドを使用して送信されます。このメソッドは、ユーザーがインターフェイスの[送信]ボタンをクリックすると、別のクラスによって呼び出されます。 – user3278983

答えて

0

私は、EJPの勧告に続いて、すぐに働いたDataInput/OutputStreamsに切り替えるとわかりました。 ObjectInput/OutputStreamsを使用する必要がありましたが、私は戻ってきました。 write/readUTFの代わりにwrite/readObjectに切り替えるまで、同じ問題が再発することがわかりました。 readObject(String)にキャストすると、すべてのメッセージを受信できます。 ObjectInput/OutputStreamsと同じ問題が発生した場合は、write/readUTFを使用してください。代わりにwrite/readObjectを試してみてください。

関連する問題