-1

ネットワーク全体で文字列の配列をストリーミングしようとしています。単一の文字列を送信できますが、文字列の配列を送信しようとすると、問題が発生します。私はいくつかの調査を行い、IDE でエラーなしで動作する修正を思いつきましたが、外部で実行するとプログラムがクラッシュします。うっかり作成してしまった無限ループにまで絞り込んでしまいました。ここに載せるには多すぎるので、すべてのコードを貼り付けます。

これが私が達成しようとしていることの要約です...

  1. テキストファイルを開く
  2. 行ごとに読み取ります (各行は配列内の個別の文字列になります)
  3. ファイルの読み取りが完了したら、個々の文字列のストリーミングを開始します
  4. 文字列を別の配列に戻す受信側に for ループを配置する
  5. 最後に、サーバー側で、文字列の各部分を 5 つの異なる文字列に分割します

ここに私のクライアントクラスがあります:

public class Transfers {

    public int port = 1223;
    //public String Ip = LoginForm.IP;
    //public String ip = null;
    public static Socket login = null;
    public static Socket sock = null;
    public static PrintWriter outStream = null;
    private static BufferedReader inStream = null;
    private static boolean ON = false;
    public static String authorize = null;
    public static boolean connected = true;

    public static void transfers(String IP, int port, String content) throws UnknownHostException, IOException {


        try {
            login = new Socket(IP, port);
            //System.out.println("Connected for streaming");
            outStream = new PrintWriter(login.getOutputStream(), true);
            outStream.println(content);
        } catch (UnknownHostException ex) {
            Logger.getLogger(Transfers.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Transfers.class.getName()).log(Level.SEVERE, null, ex);
            login.close();
        }
    }

    public static String[] recieveArray(String IP) throws UnknownHostException, IOException {
        String[] farray = null;
        sock = new Socket(IP, 1224);
        inStream = new BufferedReader(new InputStreamReader(sock.getInputStream()));
        String count = inStream.readLine();
        int counter = Integer.parseInt(count);
        System.out.println("counter");
        for (int i = 0; i < counter; i++) {
            inStream = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            farray[i] = inStream.readLine();
            System.out.println(farray[i]);
        }
        return farray;
    }
}

これが私のサーバークラスです:

public class Specials {

    private static ServerSocket server = null;
    private static Socket client = null;
    private static PrintWriter outStream = null;
    private static BufferedReader inStream = null;
    private static boolean ServerOn = true;
    public static String message = "";
    public static String command = null;
    static public InetAddress IP = null;
    public static String status = null;
    private static String file = "accounts.dat";
    private static int counter;

    public static void arraysend(String filename) throws FileNotFoundException, IOException {

        counter = 0;
        FileInputStream fstream = new FileInputStream("AppData/" + filename);
        String strLine;
        String[] filearray;


        try (DataInputStream in = new DataInputStream(fstream)) {
            BufferedReader br = new BufferedReader(new InputStreamReader(in));

            filearray = new String[1000];
            for (int j = 0; j < 10; j++) {
                filearray[j] = br.readLine();
                counter++;
            }
            in.close();
        }

        try {
            server = new ServerSocket(1224);
            client = server.accept();
            IP = client.getInetAddress();
            outStream = new PrintWriter(client.getOutputStream(), true);
            filearray[0] = Integer.toString(counter);
            outStream.println(filearray[0]);
            for (int i = 1; i < counter; i++) {
                outStream = new PrintWriter(client.getOutputStream(), true);
                outStream.println(filearray[i]);
            }
            client.close();
            server.close();
        } catch (IOException ex1) {
            Logger.getLogger(Specials.class.getName()).log(Level.SEVERE, null, ex1);
        }
    }
}

エラー メッセージは表示されません。アプリケーションがクラッシュするだけです。便宜上、コードのペーストビンを以下に含めます。

どんな助けでも感謝します、ありがとう。

c

4

2 に答える 2

1

このコードには非常に多くの問題があり、どこから始めればよいかわかりません。以下に (網羅的ではない) リストを示します。

  • クラス変数とメソッドに静的修飾子を使用しています。これらは、このように定義されている目的を果たさず、デバッグを悲惨なものにします。それらをすべて削除し ます。
  • 状態を維持するために実際に必要なクラス変数のみを作成します。現在、クラス レベルで宣言する変数のほとんどは、それらを使用するメソッド内で実際に宣言できます。
  • クライアント側のrecieveArray方法では、受信ループの反復ごとにバッファリングされたリーダーを再初期化しています。これは、以前のリーダーでバッファリングされた (そしてソケット入力ストリームからは利用できなくなった) 一部のデータを破棄することになるため、データの欠落につながる可能性が最も高いです。
  • クライアント側のrecieveArrayメソッドでは、文字列まで読み取ってい countますが、サーバー側count - 1 では、以前に入力した配列の最初の要素にカウントを格納しているため、文字列を送信します。

このコード:

for (int j = 0; j < 10; j++) {
    filearray[j] = br.readLine();
    counter++;
}

for (int i = 1; i < counter; i++) {
    outStream = new PrintWriter(client.getOutputStream(), true);
    outStream.println(filearray[i]);
}
  • 上記 (サーバー側) に投稿したコードでは、送信ループの反復ごとにクライアントへの出力ストリームも再作成しています。

これらの問題をすべて修正して再テストし、必要に応じてフォローアップの質問をしてください。

于 2012-04-21T11:45:57.840 に答える
1

farraynull で配列を初期化している Transfers クラスのコードを参照してください。 また、これをforループで使用しています

inStream = new BufferedReader(new InputStreamReader(sock.getInputStream()));

スペシャルクラスでは、再び使用しますfor

outStream = new PrintWriter(client.getOutputStream(), true);
于 2012-04-21T08:32:43.003 に答える