• 締切済み

複数のストリームからのデータの受け取り

お世話になっております。 今、一つのホストに対して複数のホストからいっせいにデータを送るというプログラムを組もうとしています。 送りたいデータはdouble型の配列なのですがストリームに書き込むには多分? OutPutStreamクラスのwrite_double_arrayというメソッドを使うようなのですがこれの使い方がいまいちわかりません。 public abstract void write_double_array(double[], int offset, int length) とあるように抽象メソッドなのでサブクラスでオーバーライドしなければいけないようなのですが、実装の仕方がわかりません。 また、これの引数のoffsetとは送信する複数のホストすべてで共通だとまずいですか? 入出力に関してはあやふやなところがおかしいのでなにか間違って認識しているようでしたらその指摘もお願いします。

  • Java
  • 回答数1
  • ありがとう数4

みんなの回答

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

たぶんですが、CORBAの話であると推測します。 ですから、CORBAの入門サイト等で、お勉強してくると良いでしょう。 CORBAと関係ない話なら、この回答は無視してください。 参考になりそうなサイトを紹介しておきます。 JDK 6 Java IDL 関連 API & 開発者ガイド -- Sun Microsystems http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/idl/index.html 他にも、CORBA関係の入門サイトは検索すれば、みつかるかと思いますよ。 また、 > public abstract void write_double_array(double[], int offset, int length) > とあるように抽象メソッドなのでサブクラスでオーバーライドしなければいけないようなのですが、実装の仕方がわかりません。 との事ですが、特に、CORBAを利用するアプリケーション側で、OutputStream内の 抽象メソッドを実装する必要は無い様子です。

kokema
質問者

お礼

CORBAで合ってると思います。 ちょっと難しそうなのでとりあえず別の方向でいってそれが無理だったときにまた見てみることにしました。 答えてくださりありがとうございます。

関連するQ&A

  • オーバーライドについて

    はじめまして。 変な質問ですみませんが質問させてください。 オーバーライドの定義についてなのですが、 オーバーライドとは、スーパークラスで定義した、メソッドの メソッド名と戻り値のデータ型と引数の数とそのデータ型が等しい メソッドをサブクラスで定義することであると、 認識しているのですが、間違いでしょうか、 特に、戻り値のデータ型はスーパークラスとサブクラスとで同じでなけ ればならないんですよね? ご教授お願いします。

    • ベストアンサー
    • Java
  • オーバーライドの必要性

    まだまだJavaを勉強している途中なのですが、下記のサンプルコードでオーバーライド(メソッドをオーバーロードすることをオーバーライドというのでしょうか…!?)のの必要性がよく分からなくなってしまったので質問させて頂きました。 /* sample.java */ abstract class super_class{  void write(){} } class CLASS1 extends super_class{  void write(){ System.out.println("CLASS1"); } } class CLASS2 extends super_class{  void write(){ System.out.println("CLASS2"); } } class sample{  public static void main(String args[]){   super_class obj = new CLASS2();   obj.write();   obj = new CLASS1();   obj.write();  } } 以上のコードを実行した場合 CLASS2 CLASS1 と表示されるのは多少なりとも勉強して分かったつもりでした…。 しかし、あくまでサンプルであるために特に意味がないことでもオーバーライドの説明をしているのだろうという風に考えてしまったのですが、 結局は、 スーパークラスとサブクラスに同じシグネチャのメソッドがあった場合、各サブクラスのメソッドが実行される と言うことは、スーパークラスのwrite()メソッドは何をしているのでしょうか? 多様性はJavaでも大切なものであるとのことなので質問させて頂きました。 なるべくわかりやすく説明して頂きたいと思います。 どうかお答えをお願いします。

    • ベストアンサー
    • Java
  • 親クラスとオーバーライドらへんのこと

    はじめまして、最近c++をはじめたものです。 質問があります。 サブクラスで親クラスのメソッドをオーバーライドした時に、 そのメソッドの中で親クラスのメソッド(オーバーライドした)をメソッドを呼び出したいのですが。 やりかたがわかりません。 要するに、javaでいうsuperを使いたいのですが。。 コードで書くとこんなかんじです。 class base { public: int abc(); } class derived : public base { public: int abc(); } int derived::abc() { super.abc() //←ここの部分がわかりません。 他の処理 }

  • 継承・実装の関係で悩んでいます。

    継承・実装の関係について悩んでいます。 ここでは、アクセス制御を考えずに、インスタンスかstaticかabstract(ここではabstract final staticやabstract classのこと)の違いで、どう継承するのか考えています。 // 継承 はメソッドのオーバーライドのことを考えます。(オーバーロードは考えない) クラスAからクラスBでオーバーライドしたメソッドは、 クラスCでさらにオーバーライドできるのでしょうか? クラスCが クラスBのクラスAからオーバーライドしたメソッド をクラスBのメソッドとして見たときに、オーバーライドすることは可能なのでしょうか? クラスA │ インスタンスフィールドA │ staticフィールドA │ │ クラスA() { } │ │ インスタンスメソッドA () { } │ staticメソッドB() { } ↓ クラスB extends クラスA │ インスタンスフィールドA // 継承 │ インスタンスフィールドB │ staticフィールドB │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ インスタンスメソッドA () { } // 継承 │ │ インスタンスメソッドB () { } │ staticメソッドB () { } ↓ クラスC extends クラスB implements インタフェースD, ... ↑ インスタンスフィールドA // クラスBのフィールドを継承 │ インスタンスフィールドB // クラスBのフィールドを継承 │ インスタンスフィールドC │ staticフィールドC │ │ サブクラス2() { } │ │ インスタンスメソッドA () { } // クラスBのメソッドを継承 │ インスタンスメソッドB () { } // クラスBのメソッドを継承 │ インスタンスメソッドD () { } // インタフェースDのメソッドを実装 │ インスタンスメソッドE () { } // インタフェースDのメソッドを実装 │ │ │ インスタンスメソッドC () { } │ staticメソッドC() { } │ interface インタフェースD extends インタフェースE ↑ │ staticフィールドD // public static final │ │ インスタンスメソッドD() { } // public abstract │ インスタンスメソッドE() { } // 継承 │ interface インタフェースE staticフィールドE // public static final インスタンスメソッドE() { } // public abstract

    • ベストアンサー
    • Java
  • 継承について

    下の質問の回答、間違ってませんか? -------------------------------------------- 親クラスのフィールドをメソッドを全て継承することになります。よって、サブクラス2は、サブクラス1とスーパークラスのメンバーを全て持つことになります。サブクラス2をインスタンス化すると、サブクラス1とスーパークラスが全てインスタンス化(コンピューターのメモリ上等に配置)されます。 ただ、可視性というものがあり、サブクラスから親クラスのメンバーを直接取り扱えない場合があります。privateや可視性修飾子無しの場合、サブクラスから直接取り扱えません。ただ、継承はされているので、インスタンスとしては存在します。例えば、 class スーパークラス{ private int abc; public int getAbc(){ return this.abc; } というクラスがあり、これを継承したサブクラスがあったとします。 サブクラスからは、privateなメンバー変数abcは直接取り扱うことができません。ただ、publicなgetAbcメソッドはサブクラスから取り扱えます。これで何が分かるかといいますと、privateなメンバーでもサブクラスに継承されるのです。単に可視性の問題で直接取り扱えないだけなのです。 また、オーバーライドされたメソッドがあったとしても、super.メソッド()で親のメソッドも呼べますので、これも継承されているのです。

  • 継承、実装についてまとめています。この図は正しいですか?

    継承、実装についてまとめています。この図は正しいですか? クラス1 から継承した クラス2のものを、クラス3で継承するのでしょうか? クラス1 │ int a; │ static int b; │ │ クラス1() { } │ │ int methodA () { } │ static int methodB() { } ↓ サブクラス1 extends クラス1 │ int a; // 継承 │ int c; │ static int d; │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ int methodA () { } // 継承 │ int methodC() { } │ static int methodD() { } ↓ サブクラス2 extends サブクラス1 implements サブインタフェース1, サブインタフェース2… ↑ int a; // サブクラス1のフィールドを継承 │ int c; // 継承 │ int e; │ static int f; │ public static final int g; // 実装(サブインタフェース1) │ public static final int h; // 実装 │ │ サブクラス2() { } │ │ int methodA () { } // サブクラス1のメソッドを継承 │ int methodC() { } // 継承 │ int methodE() { } │ static int methodF() { } │ int methodG() { } // 実装(サブインタフェース1) │ int methodH() { } // 実装 │ interface サブインタフェース1 extends スーパインタフェース1... ↑ public static final int h; │ │ public abstract int methodE() { } // 継承 │ public abstract int methodH() { } │ interface スーパーインタフェース public static final int g; public abstract int methodG() { }

    • ベストアンサー
    • Java
  • InputStreamのread()関数

    InputStreamの関数 public abstract int read()throws IOException サブクラスはこの関数をオーバーライドする。 ところがFilterInputStreamはInputStreamを変数にもちread()を呼び出している。(↓を参照) http://java.sun.com/javase/ja/6/docs/ja/api/java/io/FilterInputStream.html#read() サブクラスでオーバーライドするなら、そもそも変数でInputStreamがもてる時点でおかしいわけです。 他にも同じようなものに Socket sock; InputStream is = sock.getInputStream(); これでなぜかis.read()が使える。

    • ベストアンサー
    • Java
  • InputStream.read()でタイムアウトの処理をしたい。

    InputStream.read()でタイムアウトの処理をしたい。 現在自分は、InputStreamに入力されたデータをOutputStreamに移したいとかんがえているのですが、途中でreadメソッドが固まってしまいうまくいきません。 ソースで説明させていただきますと、 public static int copy(InputStream input,OutputStream output)throws IOException { byte[] buffer = new byte[1024 * 4]; int count = 0; int n = 0; while (0 < (n = input.read(buffer))) //ここで固まる { output.write(buffer, 0, n); count += n; System.out.println("available = " + input.available()); System.out.println(count + " byte = " + n); } return count; } このようなコピーするメソッドを書いたのですが、何度かループした後readメソッドで固まってしまいます。また、availableは常に0を返しております。 おそらくストリームの終わりが検出できないため、このような状態になっていると推測されるのですが、プログラムの性質上、InputStreamに入ってくるデータを変更することはできません。 なのでこの問題を解決するべく、ある程度の時間readメソッドがブロックされたら、breakするというような処理を書きたいのですが、どのようにすればよいでしょうか?

    • ベストアンサー
    • Java
  • 問題の解説お願いします。(オーバーロード&オーバーライド)

    class A{ protected int method1(int a , int b){ return 0; } } クラスAを継承したクラスで同時に定義できるメソッド が、 public int method1(int a,int b){return 0;} が良くて private int method1(int a,int b){return 0;} static protected int method1(int a,int b){return 0;} がだめな理由がいまいちわかりません。 法則みたいなものにこう書いてありました。 (オーバーロードについて) 同一クラス内に同一名称のメソッドを定義することができます。 ただし、それらは引数が異なるものでなければならず、 アクセス制御修飾子や戻り値の型だけが異なるメソッドは 定義することができません。 (オーバーライドについて) サブクラスでは、スーパークラスに存在するメソッドと同一引数・ 同一戻り値型を持つメソッドを定義することが許されています。 これら以外にも何か決まりがあるのでしょうか よろしくお願いします。

    • ベストアンサー
    • Java
  • 複数ホストからのデータの受け取り方

    お世話になっております。 複数のホストで計測したあるdouble型の配列データをひとつのホストに送信してそこで送られたホストによってまとめ、 結果的にはdouble型の二次配列がほしいのですが送信される側のホストに以下のサーバ機能付きのプログラムをいれたところ (見づらくてすみません、添付にもおいておきます) プログラム: import java.io.*; import java.net.*; public class RouteFind { public static int port; public static Socket socket; public static ServerSocket sSocket; public static double Data[][]; public static double RouteNode[][]; public static void main(String args[]) { Data = getData(); for (int i = 0; i < Data.length; i++) { System.out.println(RTTMeasure.AddressData[i]); System.out.println(Data[i]); System.out.println(); } } public static double[][] getData() { port = 8080; Data = null; try { sSocket = new ServerSocket(port); //sSocket is the socket while (true) { socket = sSocket.accept(); Thread t = new SessionProc(socket, Data); t.start(); } } catch (IOException e) { e.printStackTrace(); } return Data; } } class SessionProc extends Thread { double[][] data = null; Socket socket = null; public SessionProc(Socket s, double[][] data) { this.socket = s; } @Override public synchronized void run() { try { ObjectInputStream in = new ObjectInputStream( new BufferedInputStream(socket.getInputStream())); InetAddress cAddr = socket.getInetAddress(); //client address for (int i = 0; i < RTTMeasure.AddressData.length; i++) { if (cAddr.getHostName().equals(RTTMeasure.AddressData[i])) { data[i] = (double[]) in.readObject(); } } in.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } エラー: java.net.BindException: Address already in use at java.net.PlainSocketImpl.socketBind(Native Method) at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:365) at java.net.ServerSocket.bind(ServerSocket.java:319) at java.net.ServerSocket.<init>(ServerSocket.java:185) at java.net.ServerSocket.<init>(ServerSocket.java:97) at RouteFind.getData(RouteFind.java:35) at RouteFind.main(RouteFind.java:23) Exception in thread "main" java.lang.NullPointerException at RouteFind.main(RouteFind.java:24) というエラーが出てしまいました。クライアント側はなにも問題がないようです。 各ホストからの通信を別々のスレッドで処理しているつもりなのですがなにがおかしいのでしょうか? お願いします

専門家に質問してみよう