2016-10-19 7 views
1

私は学生でネットワークプログラミングを学習していて、問題があります。Java:ソケットでオブジェクトを送信して受け取る

これは私のクライアントです:

public class Test2Client_Tranfer_An_Obj { 

Socket socket = null; 
ObjectOutputStream out; 
ObjectInputStream in; 

public Test2Client_Tranfer_An_Obj() { 
    try { 
     socket = new Socket("localhost", 12345); 

     out = new ObjectOutputStream(socket.getOutputStream()); 
     in = new ObjectInputStream(socket.getInputStream()); 
     System.out.println("Ready"); 

     System.out.println("" + in.readUTF()); 
     System.out.println("" + in.readUTF()); 
     System.out.println("Recived"); 

     out.writeUTF("hihi"); 

     System.out.println("Sended"); 




    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

public static void main(String[] args) { 

    System.out.println("Client"); 
    Test2Client_Tranfer_An_Obj test = new Test2Client_Tranfer_An_Obj(); 
} 

}

この私のサーバー:

public class Test2Server_Tranfer_An_Obj { 

ServerSocket serverSocket; 
ObjectOutputStream out; 
ObjectInputStream in; 

public Test2Server_Tranfer_An_Obj() { 

    try { 
     serverSocket = new ServerSocket(12345); 
     Socket socket = serverSocket.accept(); 

     out = new ObjectOutputStream(socket.getOutputStream()); 
     in = new ObjectInputStream(socket.getInputStream()); 
     System.out.println("Ready!"); 
     out.writeUTF("huhu"); 
     out.writeUTF("hoho"); 
     System.out.println("Sended"); 

     String s = in.readUTF(); 
     System.out.println("" + s); 
     System.out.println("Recived"); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

public static void main(String[] args) { 
    System.out.println("Server"); 
    Test2Server_Tranfer_An_Obj demo = new Test2Server_Tranfer_An_Obj(); 

} 

}

しかし、私は私のプログラムを実行し、この結果:

Servコンソール

サーバー 準備完了! sendedでは

クライアントコンソール

クライアントの準備

誰もがなぜ私に言うことができると私は何ができますか? 読んでいただきありがとうございます! ご希望の返信を

+0

への書き込みにout.flush()を追加する必要があり、これは答えるためにあなたの目標 –

答えて

1

この場合、オブジェクトストリームは過剰です。あなたは実際にwriteObject/readObjectを使用しておらず、DataInputStreamDataOutputStreamを使ってあなたがしたいことをするでしょう。

この特定のケースでは、オブジェクトストリームがバッファされます。つまり、パフォーマンスを向上させるストリームflush()またはclose()のいずれかになるまで、小さな書き込みがバッファされます。どちらもしないので、writeUTFはSocketではなくメモリに書き込むだけです。

c.f.データストリームはではなく、デフォルトではがバッファリングされています。

+0

感謝するJavaの方法です! –

0

出力ストリームに書き込んだ後で、サーバーで。あなたは(Serializableインタフェース)をシリアル化について読んソケット

関連する問題