0

AndroidからPCに画像を送信しています。これはアプリの一部であり、このためにソケットを使用しています。送信部分のコードには次が含まれます

public void sendfile()
{
    try {           
    System.out.println("looppppppp");
    File file = new File(Environment.getExternalStorageDirectory()+ File.separator + "test.jpg");
    byte [] mybytearray  = new byte [(int)file.length()];  
    FileInputStream fis = new FileInputStream(file);
    BufferedInputStream bis = new BufferedInputStream(fis);
    bis.read(mybytearray,0,mybytearray.length);         
    System.out.println("Send:"+mybytearray.length);
    bis.close();
    OutputStream ous = socket.getOutputStream();
    System.out.println("Sending...");
    ous.write(mybytearray,0,mybytearray.length);
    ous.flush();
    //ous.close();  
       // socket.close();
    System.out.println("send overrrrrrrrrrr");
    }catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   
}

プログラムの開始時に、Socket はスレッドで接続されます。レシーバーは、次のようにPCのJavaコードです

@Override
public void run() 
{
try
{
ServerSocket servsocket = new ServerSocket(13267);
System.out.println("Thread Waiting...");
Socket socket = servsocket.accept();
System.out.println("Accepted connection : " + socket);
System.out.println("Connected..");
while(true)
{
// filesize temporary hardcoded
long start = System.currentTimeMillis();
int bytesRead;
int current = 0;
mybytearray  = new byte [filesize];
File f=new File("d:\\ab.jpg");
f.createNewFile();
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream(f);
BufferedOutputStream bos = new BufferedOutputStream(fos);
System.out.println("b4");
bytesRead = is.read(mybytearray,0,mybytearray.length);
System.out.println("after");
current = bytesRead;
do {
   bytesRead =
   is.read(mybytearray, current, (mybytearray.length-current));
   if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);

bos.write(mybytearray, 0 , current);
bos.flush();
long end = System.currentTimeMillis();
System.out.println(end-start);
bos.close();
fos.close();
}
}catch(IOException e)
{
System.out.println("errorr");
}
}
}

問題は、出力ストリームまたはソケットを閉じない限り、ファイルが PC に表示されないことです。出力ストリームを閉じると、ソケットが閉じられるのはなぜですか?

4

2 に答える 2

1

ファイルの送信中にソケットを有効に保つ

ファイルを送信すると、ソケットが生きたままになります。あなたのタイトルとあなたの質問との関連性がわかりません。

問題は、出力ストリームまたはソケットを閉じない限り、PC にファイルが表示されないことです。

だから閉めて。送信側でソケットを閉じると、受信側が受信ループを終了しますが、それ以外に終了する方法はありません。ストリーム コピー ループは、必要以上に複雑です。送信前または送信後にファイル全体をメモリにバッファリングする必要はなく、推奨もされません。

出力ストリームを閉じると、ソケットが閉じられるのはなぜですか?

そうするように指定されているからです。ソケットの入力ストリームまたは出力ストリームを閉じると、他のストリームとソケットが閉じられます。

于 2013-04-10T10:40:47.600 に答える