1

私は現在、次のようなクライアントサーバーアプリケーションを設計しようとしています。ユーザーはサーバーに接続し、認証がOKになると、サーバーはユーザーにいくつかのファイルを送信します。問題は、それらのファイルが(私の方法では)単一のファイルに書き込まれることです。

ここにいくつかのコードがあります:

ファイルを転送する機能

public void processFile(int id, DataOutputStream oStream, Socket socket, int tip){
        String fileName;
        if(tip==0){
            fileName="File"+Integer.toString(Intrebari[id])+".txt";
        }else{
            fileName="Image"+Integer.toString(Intrebari[id])+".jpg";
        }
        byte[] buffer=null;
        int bytesRead = 0;
        FileInputStream file=null;

        try {
            file = new FileInputStream(fileName);
            buffer = new byte[socket.getSendBufferSize()];
            while((bytesRead = file.read(buffer))>0)
                {
                oStream.write(buffer,0,bytesRead);
                }
            file.close();
        } catch (IOException ex) {
           System.out.println(ex);
        }

    }

そして、どのファイルを送信する必要があるかを選択する関数

private void send(int id) throws IOException {
        os.writeBytes("sendFile" + id+"\n");

        System.out.println("sendFile" + id);
        generatedFiles.processFile(id, os, comunicare, 0);
        if (generatedFiles.Imagini[id] == 1) {
            os.writeBytes("sendImage" + id+"\n");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(clientThread.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.out.println("sendImage" + id);
            generatedFiles.processFile(id, os, comunicare, 1);
        }
    }

os私はDataOutputStreamそれcomunicareSocketタイプであることに言及しなければなりません。

writeBytes問題は、と組み合わせるということだと思いますwrite。誰かがこの問題で私を助けることができますか?サーバーとクライアントにファイルとメッセージの両方を受信させるにはどうすればよいですか?

4

1 に答える 1

1

私はこのようなことをします:

サーバー-sendコマンドサーバー-sendファイルクライアント-ファイルが成功したことを確認します

サーバー-sendコマンドサーバー-sendファイルクライアント-ファイルの成功を確認します..。

このように...あなたがあなたよりもクライアントからのソケットを持っていると仮定します...

socket.getOutputStream.write( "FILE:SomeFile.bin、SIZE:872973493 \ r \ n" .getBytes( "エンコーディングを選択"))socket.getOutputStream.flush(); (次のようなサーバー文字列応答を期待している場合にのみフラッシュする必要があります:OK SEND ME THE FILE、IM READY、それ以外の場合も必要ありません)クライアントはそれがファイルであり、このバイトサイズを持っていることを読み取り、確認します。 socket.getInputStreamから、期待どおりのファイルの長さを取得するまで。このクライアントがファイルを受け取ったことを確認した後

その後、サーバーは別のファイルを送信できます。FILEの代わりに、IMAGE:などを使用できます。クライアント側からのメッセージを読んで、それがファイルか画像かを確認する必要があります

これがあなたを助けるかもしれないいくつかの機能です:

public static void readInputStreamToFile(InputStream is, FileOutputStream fout,
        long size, int bufferSize) throws Exception
{
    byte[] buffer = new byte[bufferSize];
    long curRead = 0;
    long totalRead = 0;
    long sizeToRead = size;
    while(totalRead < sizeToRead)
    {
        if(totalRead + buffer.length <= sizeToRead)
        {
            curRead = is.read(buffer);
        }
        else
        {
            curRead = is.read(buffer, 0, (int)(sizeToRead - totalRead));
        }
        totalRead = totalRead + curRead;
        fout.write(buffer, 0, (int) curRead);
    }
}


public static void writeFileInputStreamToOutputStream(FileInputStream in, OutputStream out, int bufferSize) throws Exception
{
    byte[] buffer = new byte[bufferSize];
    int count = 0;
    while((count = in.read(buffer)) != -1)
    {
        out.write(buffer, 0, count);
    }
}
于 2011-05-11T19:23:05.283 に答える