2011-12-26 8 views
2

私はクライアントとサーバーのJavaアプリケーションを開発し、ObjectOutputStreamとObjectInputStreamを使用してクライアントとサーバープロセス間でデータを送受信しました。配列またはオブジェクトまたはプリミティブデータを送信する必要がありますが、ObjectOutputStreamおよびObjectInputStreamを使用してプリミティブな値(writeDouble()、readDouble()、writeUTF()、readUTF())を受け取ったときに問題が発生します。プログラムは一時停止し、動作を停止しました。なぜ、問題は何ですか?クライアントとサーバープロセスの間のObjectInputStreamとObjectOutputStreamの使用

これらは、私のプログラムの断片

// client program 

    ObjectOutputStream toServer; 
    ObjectInputStream fromServer; 

// Establish connection with the server 
      Socket socket = new Socket(host, 7000); 

      // Create an output stream to the server 
      toServer = new ObjectOutputStream(socket.getOutputStream()); 
      fromServer = new ObjectInputStream(socket.getInputStream()); 

double num1 = Double.parseDouble(jtf1.getText().trim()); 
        double num2 = Double.parseDouble(jtf2.getText().trim()); 
        try { 
         toServer.writeUTF("multiply"); 
         toServer.writeDouble(num1); 
         toServer.writeDouble(num2); 
         double result = fromServer.readDouble(); 
         res.setText(String.valueOf(result)); 
        } catch (IOException ex) { 
         System.err.println(ex); 
        } 

// server program 

private ObjectOutputStream outputToClient; 
    private ObjectInputStream inputFromClient; 

// Create a server socket 
      ServerSocket serverSocket = new ServerSocket(7000); 

while (true) { 
       // Listen for a new connection request 
       Socket socket = serverSocket.accept(); 
       System.out.println("connect "); 
       outputToClient = new ObjectOutputStream(socket.getOutputStream()); 
       // Create an input stream from the socket 
       inputFromClient = 
         new ObjectInputStream(socket.getInputStream()); 
       while(true) { 
       // Read from input 
       String command = inputFromClient.readUTF(); 
       System.out.println("receive command"); 
       checkRequest(command); 
       } 
       // Write to the file 
       //outputToFile.writeObject(object); 

      } 

public void checkRequest(String cmd){ 
     //Object o = null; 
     try{ 
     if(cmd.equals(MULTIBLY)){ 
      double x = inputFromClient.readDouble(); 
      double y = inputFromClient.readDouble(); 
      double result = x*y; 
      outputToClient.writeDouble(result); 
      System.out.println("send result"); 
     }else if (cmd.equals(DIVIDE)){ 
      int x = inputFromClient.readInt(); 
      int result = 1000/x; 
      outputToClient.writeDouble(result); 
     } 
     } catch(IOException io){ 

     } 
    } 

私はDataOutputStreamを とのDataInputStreamへのObjectOutputStreamとObjectInputStreamのを変更したときにすべてのものが正しくなっています!

答えて

10

(ソケットのバッファがいっぱいでない場合)実際にデータを送信するには、クライアント側のストリームでflush()を呼び出す必要があります。 クライアントがデータを送信しないため、サーバーがブロックされているため、プログラムがハングすることがあります。

+0

これは今正しく動作しています:) – sahar

+0

データを送信してデータを受信する前にflush()を使用しますか? –

0

例外メッセージが表示されますか?プログラムが中断する前にメッセージが表示されるはずです。私はこれが答えではないことを知っていますが、私はそれをコメントとして追加することはあまりありません。

関連する問題