【发布时间】:2013-12-02 20:07:09
【问题描述】:
我有一个服务,它启动 Thread 以在套接字上执行一些操作。代码如下:
public class ServerRunnable implements Runnable {
@Override
public void run() {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket();
serverSocket.setReuseAddress(true);
serverSocket.bind(new InetSocketAddress(ProtocolConstants.USB_SERVER_PORT));
while (true) {
Socket client = serverSocket.accept();
// some code
} catch (Exception e) {
Log.e("Exception while listening on socket.", e);
} finally {
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
Log.e(e);
}
}
}
当我第一次启动服务时,一切正常,但我必须使用stopService 方法停止它。当我再次启动它时,它返回以下异常:
java.net.BindException: bind failed: EADDRINUSE (Address already in use)
此外,我在onDestroy 服务方法中添加了ServerSocket 关闭,但它没有帮助。
setReuseAddress 在bind 之前执行,为什么它不起作用?
【问题讨论】:
-
我建议您在
ServerSocket实际关闭时登录。要么是你重用了别人的端口,要么是重启时服务实际上并没有完全退出。
标签: android sockets networking port