0

2 つの Android デバイス間で写真を送信しようとしていますが、転送の問題がわかりません。ワイルループを修正するよう誰かに言われましたが、それでもうまくいきません。プロジェクトをデバイスでテストしたところ、接続に問題はありませんでした。しかし、送信タスクが開始されると、送信クライアントが停止し、「転送エラー」メッセージが受信側に表示されました。私のプログラムに何ができるか知っている人はいますか? ここでは、主に送信と受信の 2 つの部分を示します。

どんな助けにも感謝します。ありがとうございました。

送信部:

s = new Socket("192.168.0.187", 1234); 
Log.d("Tag====================","socket ip="+s);

File file = new File("/sdcard/DCIM/Pic/img1.jpg");
FileInputStream fis = new FileInputStream(file); 
din = new DataInputStream(new BufferedInputStream(fis)); 
dout = new DataOutputStream(s.getOutputStream());
dout.writeUTF(String.valueOf(file.length()));  
byte[] buffer = new byte[1024]; 
int len = 0;  
while ((len = din.read(buffer)) != -1) {  
     dout.write(buffer, 0, len); 
     tw4.setText("8 in while dout.write(buffer, 0, len);");
     }  
dout.flush();

送信部分はスムーズに動作し、while ループがオーバーした後にエラーは表示されませんでした

受信部:

 try {
File file = new File("/sdcard/DCIM/img1.jpg");
DataInputStream din = new DataInputStream(new BufferedInputStream(client.getInputStream()));
bis = new BufferedInputStream(client.getInputStream());
Log.d("Tag====================","din="+s);
    FileOutputStream fos = new FileOutputStream(file); 
    dout = new DataOutputStream(new BufferedOutputStream(fos));  
    byte[] buffer = new byte[1024];  
    int len = 0;  
    while ((len = bis.read(buffer)) != -1) {  
           dout.write(buffer, 0, len);  
           }  


    dout.flush();  
    dout.close();
    } catch (Exception e) {
    handler.post(new Runnable() {
    public void run() {
    tw1.setText("transmission error");
    }});

受信部分については、「DataInputStream din = new DataInputStream(new BufferedInputStream(client.getInputStream()));」でもスタックしているようです。そして例外をキャッチします。

再度、感謝します。

4

1 に答える 1

0

ファイルの長さを writeUTF() で書き込んでいますが、決して読み取っていません。画像を送信した後にソケットを閉じる場合は、長さは必要ありません。送信してからソケットを閉じるだけです。長さが必要な場合は、readUTF() を使用して読み取り、ソケットからターゲットに正確にその数のバイトを読み取ります。

長さが必要な場合は、数値を文字列に変換し、それを writeUTF() 形式に変換し、反対側で文字列に変換するよりも、 writeInt() または writeLong() で送信する方が理にかなっています。 readUTF() を作成し、それを int または long に変換します。もちろん、これは必要に応じて readInt() または readLong() を使用することも意味します。

編集

約100万回(毎回$があればいいのに)、Javaでストリームをコピーする標準的な方法は次のとおりです。

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

ここで、'count' は int で、'buffer' は長さ > 0、できれば 8192 以上のバイト配列です。ループする必要があることに注意してください。read() の結果を変数に格納する必要があります。その変数をテストする必要があります。write() 呼び出しで使用する必要があります。

于 2013-08-25T12:19:16.040 に答える