0

Androidクライアントを使用して卓上アプリケーションを作成しています。目的は、Android デバイスから卓上に画像を送信し、ユーザーが卓上でフリック ジェスチャを実行した後、同じ画像が電話に送り返されることです。

アンドロイドからテーブルトップへの送信はうまく機能しますが、メソッドがポートをリッスンしてループするとき (画像を受信しようとしているとき)、LogCat で "java.net.BindException: アドレスが既に使用されています" というメッセージが大量に表示されます。この例外は常にループしますが、アプリはクラッシュしていません。

テーブルトップからデータを送信するためのスニペットは次のとおりです。

public void sendImage(byte[] buffer)
{
    try {
        Socket s = new Socket("192.168.1.34",8080);

        DataOutputStream dataOutputStream = null;
        DataInputStream dataInputStream = null;

        dataOutputStream = new DataOutputStream(s.getOutputStream());
        dataInputStream = new DataInputStream(s.getInputStream());

        dataOutputStream.writeInt(buffer.length);
        dataOutputStream.write(buffer,0, buffer.length);

        s.close();

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

以下は、私の Android アプリのコードです。アプリケーションが起動すると、別のスレッドで「ImageReceiver.class」を実行しています。「ImageReceiver」は Observable オブジェクトなので、状態が変わると新しいアクティビティを開始して画像を表示できます。

public class FluidPhotoClientActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Gallery gallery = (Gallery) findViewById(R.id.gallery);
    gallery.setAdapter(new ImageAdapter(this));


    gallery.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView parent, View v, int position, long id) {

            Toast.makeText(FluidPhotoClientActivity.this, "Sending photo nr: " + position, Toast.LENGTH_SHORT).show();

            try {
                Socket s = new Socket("192.168.1.35",8888);

                DataOutputStream dataOutputStream = null;
                DataInputStream dataInputStream = null;

                dataOutputStream = new DataOutputStream(s.getOutputStream());
                dataInputStream = new DataInputStream(s.getInputStream());

                Resources res = getResources();
                Drawable draw = null;

                switch(position) // HARDCODED IMAGE POSITION
                {
                case 0:
                    draw = res.getDrawable(R.drawable.testimage);
                    break;
                case 1:
                    draw = res.getDrawable(R.drawable.testimage2);
                    break;
                }

                if(draw!=null)
                {
                    Bitmap bitmap = (Bitmap)((BitmapDrawable) draw).getBitmap();
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);

                    byte[] buffer = stream.toByteArray();

                    dataOutputStream.writeInt(buffer.length);
                    dataOutputStream.write(buffer,0, buffer.length);

                    s.close();

                    dataInputStream.close();
                    dataOutputStream.close();
                } else {
                    Toast.makeText(FluidPhotoClientActivity.this, "Error", Toast.LENGTH_SHORT).show();
                }
            } catch (IOException e) {
                Toast.makeText(FluidPhotoClientActivity.this, "IOException", Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
        }
    });

    ImageReceiver ir = new ImageReceiver();
    Thread imageListener = new Thread(ir);
    imageListener.start();

    class ImageObserver implements Observer {
        @Override
        public void update(Observable arg0, Object arg1) {
            Log.d("MESSAGE:" , "hello");
            showIncomingImage();
        }
    }
    ImageObserver io =  new ImageObserver();
    ir.addObserver(io);
}
public void showIncomingImage() {
    startActivity(new Intent(this, SingleViewActivity.class));
}

}

ImageReceiver.class - これがエラーの原因だと思います。

public class ImageReceiver extends Observable implements Runnable {

private String responseImage;

public String getResponseImage() {
    return responseImage;
}


@Override
public void run() {
    while(1==1)
    {
        try {
            ServerSocket ss = new ServerSocket(8080);
            Socket s = ss.accept();

            DataInputStream dataInputStream = new DataInputStream(s.getInputStream());
            DataOutputStream dataOutputStream = new DataOutputStream(s.getOutputStream());

            int imageSize = dataInputStream.readInt();
            byte[] buffer = new byte[imageSize];
            dataInputStream.readFully(buffer, 0, imageSize);

            Log.d("MESSAGE:", String.valueOf(buffer.length));

            ss.close();
            s.close();
            if(buffer.length > 0)
            {
                this.responseImage = String.valueOf(buffer.length);
                setChanged();
                notifyObservers();
            }



        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

}

上記のように、異なるポートを使用してデータを送受信しているため、私の論理によれば、「アドレスはまだ使用されていないはずです」-正しく理解できれば。さまざまなポートを試していましたが、役に立ちませんでした。すべてのヒントに感謝します。

4

1 に答える 1

2

ループの外側で、ServerSocketを1回作成します。

于 2012-04-18T22:06:54.167 に答える