0

サーバーとクライアントのコードをJavaで作成しました。クライアントはサーバーからファイルをダウンロードでき、サーバーは同時にクライアントにファイルを提供できる必要があります。この目的のために、私はサーバーでマルチスレッドを使用しました。

1つのクライアントでは完全に正常に機能していますが、すべてのクライアントでスレッドを使用している間、私のコードでは正しく機能していないようです。

ファイルが正しくダウンロードされていないため、破損しており、クライアントごとにサイズが異なります。

クライアントから受け入れた後、サーバーのファイルコードを提供するための新しいスレッドを作成しています-

public static void send(String pathname) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException
{

    try
    {
    System.out.println("....");

    byte[] buf = new byte[1024];
    OutputStream os = sock.getOutputStream();
    //PrintWriter writer = new PrintWriter(os);
    System.out.println("...11.");

    BufferedOutputStream out = new BufferedOutputStream(os, 1024);
    int i=0;


    System.out.println("hi1");
    File fp = new File(pathname);
    System.out.println("hi2");
    RandomAccessFile ra = new RandomAccessFile(fp,"r");
    System.out.println("hi3");
    long bytecount=1024;
    ////////////////

    while((i=ra.read(buf, 0, 1024)) != -1)
    {

    System.out.println("hi");

        bytecount += 1024;
        System.out.println("hi6");
        out.write(buf, 0, i);
        System.out.println("hi7");
        out.flush();
    }
    System.out.println("bye");
    //os.flush();
    //out.close();
    ra.close();
    //sock.close();
    }
    catch(IOException ex)
    {

    }
    }

そして、ファイル受信用のクライアントのコードは

    public void run() {
        try{
            byte[] b = new byte[1024];
            int len = 0;
            long  bytcount = 1024;

            File fp = new File(path);
            RandomAccessFile ra=new RandomAccessFile(fp,"rw");
            ra.seek(0);
            InputStream is = sock.getInputStream();
            BufferedReader reader=new BufferedReader(new InputStreamReader(is));
            while ((len = is.read(b, 0, 1024)) != -1) {
                  bytcount = bytcount + 1024;

                  //decrypt

                  ra.write(b, 0, len);

            }
            //is.close();
            //ra.close();
            //sock.close();

        }
            catch(IOException ex){
            ex.printStackTrace();
            }

//        throw new UnsupportedOperationException("Not supported yet.");
    }


}

私はここで何が悪いのかを理解していません。事前に多くの感謝を助けてください

4

2 に答える 2

3

sendは静的です。これは、という名前のソケットが1つしかないことを示唆していsockます。そうしないと、以下はコンパイルされません。

 public static void send(String pathname) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException
{

    try
    {
    System.out.println("....");

    byte[] buf = new byte[1024];
    OutputStream os = sock.getOutputStream();
    //PrintWriter writer = new PrintWriter(os);
    System.out.println("...11.");

その場合、1つを超えるクライアントへの配信がどのように信頼できるかを確認するのは困難です。同時配信を実行するには、クライアントごとに1つのソケットが必要ですか?これを確実にするためにさらに多くのコードが必要ですが、ソケット処理の設計を修正する必要があるようです。

于 2012-11-26T22:31:55.133 に答える
2

最初の問題は、サーバーでOutputStreamを使用し、クライアントでReaderを使用していることです。クライアントは、リーダーではなく、InputStreamsを使用する必要があります。

于 2012-11-26T21:01:26.797 に答える