gpt4 book ai didi

java - 在 Android 中通过 TCP 套接字连接时获取 "java.net.BindException: Adress already in use"

转载 作者:行者123 更新时间:2023-12-02 07:51:09 25 4
gpt4 key购买 nike

我正在为其创建一个带有 Android 客户端的桌面应用程序。目的是将图像从 Android 设备发送到桌面,然后用户在桌面上执行轻拂手势后,将相同的图像发送回手机。

从 android 发送到桌面效果很好,但当方法循环监听端口(尝试接收图片)时,我在 LogCat 中收到很多“java.net.BindException:地址已在使用中”。这个异常一直循环,但应用程序并没有崩溃。

这是负责从桌面发送数据的代码 fragment :

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 对象,因此当它更改状态时,我可以启动新 Activity 并显示图像。

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

}

}

正如您在上面看到的,我正在使用不同的端口发送和接收数据,因此根据我的逻辑“该地址不应该已经在使用中” - 如果我理解正确的话。我正在尝试不同的端口,但这没有帮助。我将非常感谢所有的提示。

最佳答案

在循环外创建一次 ServerSocket。

关于java - 在 Android 中通过 TCP 套接字连接时获取 "java.net.BindException: Adress already in use",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10214790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com