Android 클라이언트로 탁상용 애플리케이션을 만들고 있습니다. Android 기기에서 탁상으로 이미지를 보내고 사용자가 탁상에서 손가락으로 제스처를 한 후에 동일한 이미지가 다시 휴대 전화로 전송됩니다.안드로이드에서 TCP 소켓을 통해 연결하는 동안 "java.net.BindException : Adress가 이미 사용 중"이되었습니다.
안드로이드에서 탁상으로 보내는 작업은 훌륭하지만 "메서드를 루프 수신 할 때 (그림을 받으려고하는) LogCat에서"java.net.BindException : Adress가 이미 사용 중입니다. "라는 메시지가 나타납니다. 이 예외는 항상 반복되지만 앱이 파손되지 않습니다. 여기
는 테이블 탑에서 데이터를 전송하는 스 니펫 responisible입니다 :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();
}
}
그리고 아래에있는 내 안드로이드 응용 프로그램의 코드가있다. 응용 프로그램이 시작되면 별도의 스레드에서 "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();
}
}
}
}
당신은 내가 다른 포트를 사용하여 나의 논리 "주소가 이미 사용 안"에 따라 전송하고 데이터를 수신하고 위에서 볼 수 있듯이 - 내가 제대로 이해합니다. 다른 항구를 실험하고 있었지만 도움이되지 않았습니다. 나는 모든 조언에 대해 매우 감사 할 것입니다.
도움이되었습니다. 나는이 예외를 더 이상받지 못한다. ** ImageReceiver.class **에서 ** ** 내부 ** ** 루프 ** 및 ** ServerSocket **은 ** try ** 내부이지만 ** while ** 루프 외부에서는 ** 넣습니다. 불행히도 지금은 예외가 없으며 작동하지 않습니다. 코드가 루프 안으로 들어 가지 않습니다. – Booyaches
@Booyaches '작동하지 않는다'고 정의하십시오. while (1 == 1) 루프가 입력되지 않는다고 주장한다면, 나는 단지 당신을 믿지 않을까 두려워합니다. – EJP