電子書籍の厳選無料作品が豊富!

お世話になっております。
複数のホストで計測したある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)

というエラーが出てしまいました。クライアント側はなにも問題がないようです。
各ホストからの通信を別々のスレッドで処理しているつもりなのですがなにがおかしいのでしょうか?

お願いします

A 回答 (3件)

スタックトレースを見ると


sSocket = new ServerSocket(port); //sSocket is the socket
のとこで例外が発生しているように見えるけど

単に8080ポートを別のアプリケーションが利用しているだけなんじゃない?
    • good
    • 0

教えていただいたサイト拝見しました。


確かに、最初に指定されたポートは開放されて接続待ちになると書かれていますね。妙な疑問を申し上げて失礼しました。

・ポート番号を変えても同じ
・Runメソッドの synchronized を外しても同じ
であれば、ちょっとお力になれなさそうです。ごめんなさい。
    • good
    • 0

エラー:


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();
}
一旦接続してもまた繰り返しで接続要求待ちにすれば大丈夫だと思い込んでいました。

なるべくクライアントごとに別々のポートを割り振るのではなく、接続が来次第どんどん処理して時間短縮を図りたいのですが無理でしょうか?

補足日時:2010/01/06 09:52
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/01/07 18:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!