• 締切済み

複数ホストからのデータの受け取り方

お世話になっております。 複数のホストで計測したある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) というエラーが出てしまいました。クライアント側はなにも問題がないようです。 各ホストからの通信を別々のスレッドで処理しているつもりなのですがなにがおかしいのでしょうか? お願いします

みんなの回答

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.3

スタックトレースを見ると sSocket = new ServerSocket(port); //sSocket is the socket のとこで例外が発生しているように見えるけど 単に8080ポートを別のアプリケーションが利用しているだけなんじゃない?

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

教えていただいたサイト拝見しました。 確かに、最初に指定されたポートは開放されて接続待ちになると書かれていますね。妙な疑問を申し上げて失礼しました。 ・ポート番号を変えても同じ ・Runメソッドの synchronized を外しても同じ であれば、ちょっとお力になれなさそうです。ごめんなさい。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

エラー: java.net.BindException: Address already in use at java.net.PlainSocketImpl.socketBind(Native Method) というエラーなので、ソケットをバインドするさいに、アドレスが既に使用されている、ということは・・?同一のポートで、ソケットが複数同時に使えるものでしょうか? サイトを検索すると、どうも使えないようなことが書いてありますが。

kokema
質問者

お礼

自己解決しまいました。 その都度ホストに入りなおせばポートがリセットされるみたいで やりにくいですが一旦プログラムを起動した後はまた入りなおせば解決するようです

kokema
質問者

補足

このプログラムをつくる上で参考にしたクライアントとサーバプログラムのペアがあるのですが、(↓にあります) http://www.fumikichan.net/prog/Java/kd050101.jsp そのプログラムではクライアントを複数ホストにおいて起動させてもスレッド処理の際に自動的にそれぞれ別ポートに割り振って接続しているようだったので↓以降はスレッド処理して while (true) { socket = sSocket.accept(); Thread t = new SessionProc(socket, Data); t.start(); } 一旦接続してもまた繰り返しで接続要求待ちにすれば大丈夫だと思い込んでいました。 なるべくクライアントごとに別々のポートを割り振るのではなく、接続が来次第どんどん処理して時間短縮を図りたいのですが無理でしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Tomcat起動時にエラー

    お世話になります。 以前は動いていたTomcatを久しぶりに起動(Start.bat) してみたら、コマンドプロンプトに以下のようなエラーが出て起動できません。 -- 2002-08-21 17:18:35 - ContextManager: Adding context Ctx( /test ) 2002-08-21 17:18:41 - PoolTcpConnector: Starting HttpConnectionHandler on 8080 FATAL:java.net.BindException: Address in use: JVM_Bind java.net.BindException: Address in use: JVM_Bind at java.net.PlainSocketImpl.socketBind(Native Method) at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:397) at java.net.ServerSocket.<init>(ServerSocket.java:170) at java.net.ServerSocket.<init>(ServerSocket.java:121) TOMCAT_HOME d:\jakarta-tomcat-3.2.4 JAVA_HOME c:\jdk1.3 PASS c:\jdk1.3\bin 等は宣言してあるのですが。。。 わかる方ご教授ください。よろしくお願いします。

  • 初歩的なソケット通信(java)

    初歩的なソケット通信(java) javaのソケット通信プログラムについて質問させて頂きます。まだまだ基礎の段階なのですが、詰まってしまたので、良かったら教えてください。 以下プログラムコード ------------------------------------- //サーバー側 import java.net.*; import java.io.*; public class Server { static int port = 12345; public static void main(String[] args) { try{ //サーバソケットの作成 ServerSocket ssoc = new ServerSocket(port); //メインループ while(true){ try{ System.out.println("クライアントからの接続を"+ port +"で待ちます"); Socket soc = ssoc.accept(); System.out.println(soc.getInetAddress().getHostName()+"から接続を受けました"); //処理をスレッドに任せます new Connect(soc); }catch(IOException e1){ e1.printStackTrace(); } } }catch(IOException e2){ e2.printStackTrace(); } } } class Connect extends Thread{ private Socket socket = null; public Connect(Socket socket){ this.socket = socket; //スレッド開始 this.start(); } public void run(){ try{ //出力ストリームを取得 OutputStream os = socket.getOutputStream(); PrintWriter out = new PrintWriter(os,true); //入力ストリームを取得 InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader in = new BufferedReader(isr); String inputLine; while((inputLine = in.readLine()) != null){ //System.out.println(inputLine); out.println(inputLine); } System.out.println("処理が終わったので接続を切ります"); in.close(); out.close(); socket.close(); }catch(Exception e1){ try{ socket.close(); }catch(Exception e2){ e2.printStackTrace(); } } } }

  • javaのsslプログラムについて質問です

    以下のサイトにありますjavaのプログラムを実行したいのですが https://github.com/Kanatoko/POODLE 実行環境はどのようなものを想定しているプログラムなのでしょうか 実際にローカルにssl3.0のサーバを立ててその環境で実行するプログラムなのか JDKなどjavaの環境があれば実行できるプログラムなのか、、など 私が実行した結果以下のエラーを吐きましてお手上げ状態です [java] Exception in thread "main" java.net.BindException: アドレスは既に使 用中です [java] at java.net.PlainSocketImpl.socketBind(Native Method) [java] at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376) [java] at java.net.ServerSocket.bind(ServerSocket.java:376) [java] at java.net.ServerSocket.<init>(ServerSocket.java:237) [java] at javax.net.ssl.SSLServerSocket.<init>(SSLServerSocket.java:181) [java] at sun.security.ssl.SSLServerSocketImpl.<init>(SSLServerSocketImpl.java:134) [java] at sun.security.ssl.SSLServerSocketFactoryImpl.createServerSocket(SSLServerSocketFactoryImpl.java:91) [java] at MPoodle.main(MPoodle.java:39) 環境は仮想環境で centos JDK1.7 apache https 443 ssl3.0のみうけつける 上で言いました通り実行環境はなんなのでしょうか、、javaは全くの素人でして ソケットプログラミングで、portを443と1443などどうなっているのかもさっぱりでございます。。。 どなたかご教授お願いしたします。

  • tomcat3.2.3

    tomcat4.0.1をいれていたのですが、 他のものとの互換性の問題があり、 tomcat3.2.3をいれました。 そうすると、以下のエラーで tomcatが実行できません。 FATAL:java.net.BindException: java.net.BindException at java.net.PlainSocketImp1.socketBind(Native Method) at java.net.PlainSocketImp1.bind(PlainSocketImp1.java:452) at java.net.ServerSocket.<init>(Server\Socket.java:170) at java.net.ServerSocket.<init>(ServerSocket.java:121) at org.apache.tomcat.net. DefaultServerSocketFactory.createSocket(DefaultServerSocketFactory.java:97) at org.apache.tomat.service.PoolTcpEndpoint.startEndpoint(PoolTcpEndpoint.java:239) at org.apache.tomcat.service.PoolTcpConnector.start(PoolTcpConnector.java:188) at org.apache.tomcat.core.ContextManager.start(Conte at org.apache.tomcat.startup.Tomcat.execute(Tomcat.j at org.apache.tomcat.startup.Tomcat.main(Tomcat.java なにか、はずしていそうなことがありましたらおしえてください。

  • コンストラクターの生成でエラーが出ます。

    こんにちは、site7(tokopokoからIDを変えました)と言います。 リフレクションを使って、 Double(doulbe)のコンストラクターを呼び出すプログラムを作りました。 しかし、実行するとエラーになります。 原因または解決策をご存知の方はいらっしゃいませんか。 ■プログラム import java.lang.reflect.*; class TestConstructor { public static Class<?> type; public static void main(String[] args) { try { type = Class.forName("java.lang.Double"); Double d = (Double)TestConstructor.createInstance(3.0); System.out.println(d.toString()); } catch (Exception e) { e.printStackTrace(); } } public static Object createInstance(Object... args) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { Class<?>[] parameterTypes = new Class<?>[args.length]; for (int i = 0; i < args.length; i++) { parameterTypes[i] = args[i].getClass(); } Constructor<?> constructor = type.getConstructor(parameterTypes); //Constructor<?> constructor = type.getConstructor(double.class); return constructor.newInstance(args); } } ■実行例 D:\>javac TestConstructor.java D:\>java TestConstructor java.lang.NoSuchMethodException: java.lang.Double.<init>(java.lang.Double) at java.lang.Class.getConstructor0(Class.java:2706) at java.lang.Class.getConstructor(Class.java:1657) at TestConstructor.createInstance(TestConstructor.java:21) at TestConstructor.main(TestConstructor.java:7) ■私の環境は以下の通りです。 OS: Microsoft Windows XP Professional SP2 java: java version "1.6.0_03"

    • ベストアンサー
    • Java
  • URLで指定したページのデータを読むには?

    URLをしていしてデータを読み込みたいのですが”java.net.ConnectException: Connection timed out”となってしまいます。なぜでしょうか。 import java.io.*; import java.net.*; /** * ウェブ上のデータを取得するサンプル * */ public class GetFileFromWeb { public static void main(String[] args){ URL url = null; //HttpURLConnection con = null; try{ //URLの指定 url = new URL("http://www.****"); //入力ストリームを取得する InputStream is = url.openStream(); //URLからデータを読み取り、表示する。 byte[] data = new byte[1024]; int i; while((i=is.read(data))!=-1){ System.out.write(data, 0, i); } }catch(MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • System.inをClose()すると例外が発生する。

    こんにちは、tokopokoといいます。 ■次のプログラムを実行すると、エラーになります。 なぜエラーになるのか、ご存知の方はいらっしゃいませんか。 import java.io.*; class TestInput { public static void main(String[] args) { System.out.println("first = \"" + getInputValue("first?") + "\""); System.out.println("second = \"" + getInputValue("second?") + "\""); } public static String getInputValue(String message) { String returnString = ""; System.out.print(message); BufferedReader input = null; try { input = new BufferedReader(new InputStreamReader(System.in)); returnString = input.readLine(); } catch (IOException e) { e.printStackTrace(); } finally { if (input != null) { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } } return returnString; } } ■実行例 D:\>javac TestInput.java D:\>java TestInput first?100 first = "100" second?java.io.IOException: Stream closed at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145 ) at java.io.BufferedInputStream.read(BufferedInputStream.java:308) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) at java.io.InputStreamReader.read(InputStreamReader.java:167) at java.io.BufferedReader.fill(BufferedReader.java:136) at java.io.BufferedReader.readLine(BufferedReader.java:299) at java.io.BufferedReader.readLine(BufferedReader.java:362) at TestInput.getInputValue(TestInput.java:14) at TestInput.main(TestInput.java:5) second = "" ■私の環境は以下の通りです。 OS: Microsoft Windows XP Professional SP2 java: java version "1.6.0_03"

    • ベストアンサー
    • Java
  • JavaのTCPソケット通信プログラムについて

    初めてJavaでTCPソケット通信を書いてみたのですが、質問です。ソケット通信をサーバーとクライアント側で確立した後、メッセージの送受信をやるとても簡素なプログラムを作成しました。一回目の送受信をするだけだと上手くいくのですが、同じコネクション内で二回目の送受信をするよう追記したところ動作がおかしくなりました。(一つ目のメッセージも受信しないまま画面が停止した状態になる)何が問題なのでしょうか。 (Receiver.java) public class Receiver { public static final int PORT = 30000; public static void main(String[] args) { try { ServerSocket serverSoc = new ServerSocket(PORT); Socket socket = null; System.out.println("Waiting for Connection.."); socket = serverSoc.accept(); System.out.println("Connection from "+socket.getInetAddress()); // receive message BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("Message from sender ="+new String(br.readLine())); //send message←ここを追記するとおかしくなりました。 String message = "Hey This is receiver"; BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); System.out.println("I will send: "+message); bw.write(message); br.close(); bw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } (Sender.java) public class Sender { public static final int PORT = 30000; public static void main(String[] args) { try { InetAddress LocalHost = InetAddress.getLocalHost(); InetSocketAddress socketAddress = new InetSocketAddress(LocalHost, PORT); Socket socket = new Socket(); socket.connect(socketAddress, 10000); //send message String message = "Hey This is sender"; BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); System.out.println("I will send: "+message); bw.write(message); // receive message←同じくここを追記するとおかしくなりました。 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("Message from receiver ="+new String(br.readLine())); br.close(); bw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }

  • MySQLへ途中から接続できなくなる

    MySQL 5.5.27, mysql-connector-java 5.1.12を用いて,MySQLにアクセスしています. しばらくは動いているのですが,時間が経つと,以下のようなエラーを吐いて止まってしまいます. 関連するコードは以下の通りです. https://gist.github.com/4243576 どなたか解決法が分かる方がいらっしゃいましたら,よろしくお願い致します. ----以下エラーコードです (行数はコードと対応しておりません. エラーコードの39行目に当たるのがgistの35行目, 287行目に当たるのがgistの46行目 291行目に当たるのがgistの50行目 になります.) com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link fai lure The last packet sent successfully to the server was 0 milliseconds ago. The driv er has not received any packets from the server. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1 122) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2260) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:787) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49) at sun.reflect.GeneratedConstructorAccessor10.newInstance(Unknown Source ) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java :285) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at botan.DBManager.connect(DBManager.java:39) at botan.DBManager.insertStatusIdsLong(DBManager.java:287) Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communicatio ns link failure The last packet sent successfully to the server was 0 milliseconds ago. The driv er has not received any packets from the server. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Sou rce) at java.lang.reflect.Constructor.newInstance(Unknown Source) at com.mysql.jdbc.Util.handleNewInstance(Util.java:409) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1 122) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2181) ... 16 more Caused by: java.net.SocketException: No buffer space available (maximum connecti ons reached?): connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(Unknown Source) at java.net.PlainSocketImpl.connectToAddress(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.<init>(Unknown Source) at java.net.Socket.<init>(Unknown Source) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.ja va:256) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:293) ... 17 more Exception in thread "main" java.lang.NullPointerException at botan.DBManager.insertStatusIdsLong(DBManager.java:291)

  • Macで実行可能jarが実行できない

    EclipseでJavaの開発をしているのですが、Windowsで実行可能jarでエクスポートするとダブルクリックで実行できるソースコードが同じコードで、Macでエクスポートすると実行出来ません。 ダブルクリックすると、 Java JARファイル"hoge.jar"を起動できませんでした。 というメッセージが出ます。コンソールから java hoge.jar と実行すると、 Exception in thread "main" java.lang.NoClassDefFoundError: Hoge/jar Caused by: java.lang.ClassNotFoundException: hoge.jar at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) と出ます。 Macは使い始めで余計によくわかりません。よろしくお願いします。

    • ベストアンサー
    • Java