
Ubuntu日本語フォーラム

ログインしていません。
クライアント側のプログラムは、参考書のものを使っています。サーバ側は、参考書にはのっていないため、
自作したのですが、うまく起動してくれません。
クライアント側の動作は、IPアドレスとポート番号とファイル名を指定し、接続ソケットを作成し、指定したファイルに書かれた未圧縮バイトを送信します。
そして、サーバが圧縮したバイトを受け取り、新しいファイルにそれを書き込みます。
2つのプログラムを実行すると、クライアントの圧縮バイトを読み込む段階で次のエラーが出ます。
Wは、クライアント側で出力ソケットに未圧縮バイトが書き込まれたことを意味しています。
WWWWWWWWException in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at socket_127.CompressClient.main(CompressClient.java:34)
未圧縮バイトの送信は出きるのですが、圧縮バイトを読み込めません。
クライアント側は、参考書のものですから間違いはないと思うので、自作したサーバ側に問題があるのだと思います。
下のプログラムは、サーバ側のプログラムです。
CompressProtocolFactory();は圧縮サーバを実装したインターフェイスです。
そして、protoFactory.createProtocol(clntSock, logger)は、未圧縮バイトを圧縮する処理をしてくれるメソッドです。
どの部分がおかしいか分かる方、アドバイスお願いします。
package socket_129;
import java.net.*; // for Socket
import java.io.*; // for IOException and [File]Input/OutputStream
public class CompressServer {
public static void main(String[] args) throws IOException {
if (args.length != 1) // Test for correct # of args
throw new IllegalArgumentException("Parameter(s): <Port>");
int port = Integer.parseInt(args[0]); // Server port
ServerSocket servSock = new ServerSocket(port);
Logger logger = new ConsoleLogger();
Socket clntSock = servSock.accept();
ProtocolFactory protoFactory = new CompressProtocolFactory();
protoFactory.createProtocol(clntSock, logger);
}
}
CompressProtocolFactoryクラスが書かれたソースファイルも載せます。
package socket_129;
import java.net.*; // for Socket
import java.io.*; // for IOException and Input/OutputStream
import java.util.*; // for ArrayList
import java.util.zip.*; // for GZIPOutputStream
public class CompressProtocolFactory implements ProtocolFactory {
static public final int BUFSIZE = 1024; // Size of receive buffer
public Runnable createProtocol(final Socket clntSock, final Logger logger) {
return new Runnable() {
public void run() {
CompressProtocolFactory.handleClient(clntSock, logger);
}
};
}
static public void handleClient(Socket clntSock, Logger logger) {
ArrayList entry = new ArrayList();
entry.add("Client address and port = " +
clntSock.getInetAddress().getHostAddress() + ":" +
clntSock.getPort());
entry.add("Thread = " + Thread.currentThread().getName());
try {
// Get the input and output streams from socket
InputStream in = clntSock.getInputStream();
GZIPOutputStream out = new GZIPOutputStream(clntSock.getOutputStream());
byte[] buffer = new byte[BUFSIZE]; // Allocate read/write buffer
int bytesRead; // Number of bytes read
// Receive until client closes connection, indicated by -1 return
while ((bytesRead = in.read(buffer)) != -1)
out.write(buffer, 0, bytesRead);
out.finish(); // Flush bytes from GZIPOutputStream
} catch (IOException e) {
logger.writeEntry("Exception = " + e.getMessage());
}
try { // Close socket
clntSock.close();
} catch (IOException e) {
entry.add("Exception = " + e.getMessage());
}
logger.writeEntry(entry);
}
}
オフライン
この場所は「Ubuntuを用いた開発」を相談するための場所ではありますが、「Ubuntuで動かそうとするJAVA全般」を記載すべき場所ではありません。言い換えると、「他のJAVA実行環境では動くが、Ubuntu上のJVMでは動かない」といった事例をここで相談するのは問題ありませんが、「単にJAVAプログラムが動かない」というのであれば、他の適切な相談場所を探すべきです。
また、CompressProtocolFactory.javaの部分はご自身で作られていないのではないかと思いますが、引用として明示されていません。これは不適切な引き写しではないでしょうか?
オフライン