2012-04-18 1 views
0

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(); 
     } 
    } 

} 

}

당신은 내가 다른 포트를 사용하여 나의 논리 "주소가 이미 사용 안"에 따라 전송하고 데이터를 수신하고 위에서 볼 수 있듯이 - 내가 제대로 이해합니다. 다른 항구를 실험하고 있었지만 도움이되지 않았습니다. 나는 모든 조언에 대해 매우 감사 할 것입니다.

답변

2

루프 외부에서 한 번 ServerSocket을 만듭니다.

+0

도움이되었습니다. 나는이 예외를 더 이상받지 못한다. ** ImageReceiver.class **에서 ** ** 내부 ** ** 루프 ** 및 ** ServerSocket **은 ** try ** 내부이지만 ** while ** 루프 외부에서는 ** 넣습니다. 불행히도 지금은 예외가 없으며 작동하지 않습니다. 코드가 루프 안으로 들어 가지 않습니다. – Booyaches

+1

@Booyaches '작동하지 않는다'고 정의하십시오. while (1 == 1) 루프가 입력되지 않는다고 주장한다면, 나는 단지 당신을 믿지 않을까 두려워합니다. – EJP

관련 문제