お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2009-10-24 00:21:22

debukawa
新しいメンバ
登録日: 2009-09-27

圧縮プロトコルプログラムの実行時のエラー

クライアント側のプログラムは、参考書のものを使っています。サーバ側は、参考書にはのっていないため、
自作したのですが、うまく起動してくれません。

クライアント側の動作は、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);
  }
}

オフライン

 

#2 2009-10-24 00:38:53

hito
管理者
登録日: 2007-03-18

Re: 圧縮プロトコルプログラムの実行時のエラー

この場所は「Ubuntuを用いた開発」を相談するための場所ではありますが、「Ubuntuで動かそうとするJAVA全般」を記載すべき場所ではありません。言い換えると、「他のJAVA実行環境では動くが、Ubuntu上のJVMでは動かない」といった事例をここで相談するのは問題ありませんが、「単にJAVAプログラムが動かない」というのであれば、他の適切な相談場所を探すべきです。

また、CompressProtocolFactory.javaの部分はご自身で作られていないのではないかと思いますが、引用として明示されていません。これは不適切な引き写しではないでしょうか?

オフライン

 

#3 2009-10-24 00:47:48

debukawa
新しいメンバ
登録日: 2009-09-27

Re: 圧縮プロトコルプログラムの実行時のエラー

すいません。おっしゃるとおりです。
このトピックは削除してください。

オフライン

 

Board footer

Powered by FluxBB