2012-03-22 8 views
0

現在、クライアントとの接続を作成するためにサーバーを取得しようとしています。接続ごとにスレッドを作成しましたが、サーバーは現在入力ストリームを作成していません。私は数字を印刷することでこれをテストしましたが、1と2しか印刷されません。私はこれが欠けている小さな問題だと確信しています。ObjectInputStreamが正常に動作しません

public class ObjectHandler implements Runnable{ 
    Socket sock; 
    ObjectInputStream ois; 
    ObjectOutputStream oops; 
    InputStream is; 


    public ObjectHandler(Socket clientSocket) throws IOException { 
     System.out.println("1"); 
     sock = clientSocket; 

     is = sock.getInputStream(); 
     System.out.println("2"); 
     ois = new ObjectInputStream(new BufferedInputStream(is)); 
     System.out.println("3"); 

     OutputStream os = sock.getOutputStream(); 

     oops = new ObjectOutputStream(new BufferedOutputStream(os)); 
     outputSockets.add(oops);  

    } 

は、私は今、IOExceptionがスロー除去され、トライキャッチを読者に囲まれています。クライアントがクラッシュした後、このエラーが表示されるようになりました。

at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2280) 
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2749) 
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:779) 
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279) 
at ThreadPool$ObjectHandler.<init>(ThreadPool.java:95) 
at ThreadPool.addThread(ThreadPool.java:31) 
at ObjectServerTest.go(ObjectServerTest.java:93) 
at ObjectServerTest.main(ObjectServerTest.java:124) 
+1

あなたは例外を取得していますか?あなたは私たちにスタックトレースを与えることができますか? –

+2

これはスタックトレースの一部に過ぎません。私たちはそれをすべて見る必要があります。 – skaffman

答えて

6

は、あなたは常に最初フラッシュそれを(原因ストリームが実装されているどのように)入力ストリームを作成する前に、出力ストリームを構築する必要があります。

0

BufferedInputStreamを削除します。あなたはそれを必要としません。 4Kバイトが読み込まれるまで待機しています。

編集: BufferedOutputStreamも削除します。 クライアント側で出力ストリームをフラッシュしていることを確認してください。オブジェクトを構築することは、ソケットの上にストリームすると

+1

バッファリングされた入力ストリームを作成しても、読み込みは行われません。さらに重要なことは、バッファされた入力ストリームから読み込むには、値を返す前に4kバイトのデータを読み込む必要がないことです。 – Perception

0

これは私の作品...

ObjectHandler:

public ObjectHandler(Socket clientSocket) throws IOException { 
    System.out.println("1"); 
    sock = clientSocket; 
} 


@Override 
public void run() { 
    try { 
     is = sock.getInputStream(); 
     System.out.println("2"); 
     ois = new ObjectInputStream(new BufferedInputStream(is)); 
     System.out.println("3"+ois.readFloat()); 

     OutputStream os = sock.getOutputStream(); 

     oops = new ObjectOutputStream(new BufferedOutputStream(os)); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

クライアント:

public static void main(String[] args) throws UnknownHostException, IOException { 
    Socket client = new Socket(InetAddress.getByName("localhost"), 8888); 
    OutputStream os = client.getOutputStream(); 
    ObjectOutputStream oos = new ObjectOutputStream(os); 
    oos.writeFloat(new Float(10.10)); 
    oos.flush(); 
} 
関連する問題