- 締切済み
複数ホストからのデータの受け取り方
お世話になっております。 複数のホストで計測したある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) というエラーが出てしまいました。クライアント側はなにも問題がないようです。 各ホストからの通信を別々のスレッドで処理しているつもりなのですがなにがおかしいのでしょうか? お願いします
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- askaaska
- ベストアンサー率35% (1455/4149)
スタックトレースを見ると sSocket = new ServerSocket(port); //sSocket is the socket のとこで例外が発生しているように見えるけど 単に8080ポートを別のアプリケーションが利用しているだけなんじゃない?
- osu_neko09
- ベストアンサー率48% (56/115)
教えていただいたサイト拝見しました。 確かに、最初に指定されたポートは開放されて接続待ちになると書かれていますね。妙な疑問を申し上げて失礼しました。 ・ポート番号を変えても同じ ・Runメソッドの synchronized を外しても同じ であれば、ちょっとお力になれなさそうです。ごめんなさい。
- osu_neko09
- ベストアンサー率48% (56/115)
エラー: java.net.BindException: Address already in use at java.net.PlainSocketImpl.socketBind(Native Method) というエラーなので、ソケットをバインドするさいに、アドレスが既に使用されている、ということは・・?同一のポートで、ソケットが複数同時に使えるものでしょうか? サイトを検索すると、どうも使えないようなことが書いてありますが。
お礼
自己解決しまいました。 その都度ホストに入りなおせばポートがリセットされるみたいで やりにくいですが一旦プログラムを起動した後はまた入りなおせば解決するようです
補足
このプログラムをつくる上で参考にしたクライアントとサーバプログラムのペアがあるのですが、(↓にあります) http://www.fumikichan.net/prog/Java/kd050101.jsp そのプログラムではクライアントを複数ホストにおいて起動させてもスレッド処理の際に自動的にそれぞれ別ポートに割り振って接続しているようだったので↓以降はスレッド処理して while (true) { socket = sSocket.accept(); Thread t = new SessionProc(socket, Data); t.start(); } 一旦接続してもまた繰り返しで接続要求待ちにすれば大丈夫だと思い込んでいました。 なるべくクライアントごとに別々のポートを割り振るのではなく、接続が来次第どんどん処理して時間短縮を図りたいのですが無理でしょうか?