2016-04-12 24 views
2

複数のオブジェクトをソケット経由でJavaサーバーに送信しようとしています。複数のオブジェクトを同じサーバーに送信するJavaソケット

Gerneral型を使用するには、メッセージをクラスMessageのインスタンスに変換し、このオブジェクトをサーバーに送信します。 私は、サーバーに3つのオブジェクトを送信する小さなtestclassを書いた。 問題は、1つのオブジェクトだけがサーバーに到達することです。 私はほとんどすべてを試みましたが、成功しませんでした。

マイサーバー:

public class Server { 
    private ServerConfig conf = new ServerConfig(); 
    private int port = Integer.parseInt(conf.loadProp("ServerPort")); 
    Logger log = new Logger(); 
    ServerSocket socket; 
    Chat chat = new Chat(); 

    public static void main(String[] args) { 
     Server s = new Server(); 
     if (s.runServer()) { 
      s.listenToClients(); 
     } 
    } 

    public boolean runServer() { 
     try { 
      socket = new ServerSocket(port); 
      logToConsole("Server wurde gestartet!"); 
      return true; 
     } catch (IOException e) { 
      logToConsole("Server konnte nicht gestartet werden!"); 
      e.printStackTrace(); 
      return false; 
     } 
    } 

    public void listenToClients() { 
     while (true) { 
      try { 
       Socket client = socket.accept(); 
       ObjectOutputStream writer = new ObjectOutputStream(client.getOutputStream()); 
       Thread clientThread = new Thread(new Handler(client, writer)); 
       clientThread.start(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void logToConsole(String message) { 
     System.out.print(message); 
    } 

    public class Handler implements Runnable { 

     Socket client; 
     ObjectInputStream reader; 
     ObjectOutputStream writer; 
     User user; 

     public Handler(Socket client, ObjectOutputStream writer) { 
      try { 
       this.client = client; 
       this.writer = writer; 
       this.reader = new ObjectInputStream(client.getInputStream()); 
       this.user = new User(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void run() { 
      while (true) { 
       Message incomming; 
       try { 
        while ((incomming = (Message) reader.readUnshared()) != null) { 
         logToConsole("Vom Client: \n" + reader.readObject().toString() + "\n"); 
         logToConsole(
           "Vom Client: \n" + incomming.getType() + "-----" + incomming.getValue().toString()); 
         handle(incomming); 
        } 
       } catch (SocketException se) { 
        se.printStackTrace(); 
        Thread.currentThread().interrupt(); 

       } catch (IOException ioe) { 
        ioe.printStackTrace(); 
        Thread.currentThread().interrupt(); 

       } catch (ClassNotFoundException e) { 
        e.printStackTrace(); 
        Thread.currentThread().interrupt(); 

       } 

      } 
     } 

     private void handle(Message m) throws IOException { 
      String type = m.getType(); 
      if (type.equals(config.ConstantList.Network.CHAT.toString())) { 
       chat.sendMessage(m); 
      } else if (type.equals(config.ConstantList.Network.LOGIN.toString())) { 
       System.out.println(user.login(m.getValue().get(0), writer)); 
       System.out.println(m.getValue().get(0)); 
      } 
     } 
    } 

} 

クライアント:

public class Connect { 

    Socket client = null; 
    ObjectOutputStream writer = null; 
    ObjectInputStream reader = null; 
    private Config conf = new Config(); 
    //private String host = conf.loadProp("ServerIP"); 
    String host = "localhost"; 
    private int port = Integer.parseInt(conf.loadProp("ServerPort")); 

    public boolean connectToServer() { 
     try { 
      client = new Socket(host, port); 
      reader = new ObjectInputStream(client.getInputStream()); 
      writer = new ObjectOutputStream(client.getOutputStream()); 
      logMessages("Netzwerkverbindung hergestellt"); 
      Thread t = new Thread(new MessagesFromServerListener()); 
      t.start(); 
      return true; 
     } catch (Exception e) { 
      logMessages("Netzwerkverbindung konnte nicht hergestellt werden"); 
      e.printStackTrace(); 
      return false; 
     } 
    } 

    public boolean isConnectionActive() { 
     if (client == null || writer == null || reader == null){ 
      return false; 
     }else{ 
      return true; 
     } 
    } 

    public void sendToServer(Message m) { 
     try { 
      writer.reset(); 
      writer.writeUnshared(m); 
      writer.flush(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

そして、私はクラスとオブジェクトを送信しよう:

public void sendChatMessage(String username, String message) throws InterruptedException { 
     ChatMessage cm = new ChatMessage(); 
     cm.setChat(username, null, message); 
     Message m = new Message(cm); 
     conn.sendToServer(m); 
     System.out.println("SENDED"); 
    } 

public static void main(String[] args) throws InterruptedException { 
     String username = "testuser"; 
     String chatmessage = "Hallo Welt!"; 
     connect.connect(); 
     sendChatMessage(username, chatmessage); 
     sendChatMessage(username, chatmessage); 
     sendChatMessage(username, chatmessage); 
    } 

私は、これは常に同じであることを知っていますメッセージですが、テスト目的でのみ使用されます。 メッセージはシリアライズ可能なオブジェクトであり、1つのオブジェクトのみが設計どおりに動作します。

誰かが私のミスをどこに見ましたか?

+0

2番目のオブジェクトを読み込む予定のハンドラ内のサーバーにブレークポイントを追加します。次に、ソースを調べて、何が起こっているかを見てください。 – f1sh

+0

私はそれをしました、そして、ここでは1つのメッセージしか表示されませんでした、処理が終了したとき、サーバはアイドル状態のままでした。 – tschaefermedia

答えて

2
while ((incomming = (Message) reader.readUnshared()) != null) { 

ここでは、オブジェクトを読み取り、到着するまでブロックしています。ここで

logToConsole("Vom Client: \n" + reader.readObject().toString() + "\n"); 

あなたはオブジェクトを読んで、それが到着するまでブロックし、その後、誤ってすでに前の行に読んで、それをオブジェクトとしてログインしています。

reader.readObject()を記録するのではなく、incomingの値をロギングする必要があります。この値も誤っています。

ループが正しくありません。 readObject()は、ストリームの最後にnullを返しません。それはEOFExceptionをスローします。 nullを書くたびにnullを返すことができるため、ループ終了条件として使用すると完全に間違っています。あなたはEOFExceptionをキャッチして壊れてしまいます。

-2

ServerクラスのソリューションlogToConsole("Vom Client: \n" + reader.readObject().toString() + "\n");が見つかり、接続をブロックします。

関連する問題