- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我实现了自己的android服务如下
public class MyService extends Service {
private static final String TAG = "MyService";
private Server mServer;
private LocalServerSocket server;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Log.d(TAG, "onCreate");
mServer = new Server();
mServer.start();
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy");
if(server != null){
try {
server.close();
} catch (IOException e) {
Log.d(TAG, "exception in server close");
e.printStackTrace();
}
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStart");
return START_STICKY;
}
class Server extends Thread {
@Override
public void run() {
try {
server = new LocalServerSocket("my.socket");
while (true) {
LocalSocket receiver;
try{
receiver = server.accept();
}catch(SocketException e){
Log.d(TAG, "SocketException");
break;
}
catch(IOException e){
Log.d(TAG, "IOException");
break;
}
if (receiver != null) {
Log.d(TAG, "Got Data in receiver");
}
receiver.close();
}
} catch (IOException e) {
Log.d(TAG, "one more");
e.printStackTrace();
}
}
}
}
我面临的问题是,如果我的 LocalServerSocket 在 accept() 中阻塞,那么在 OnDestroy() 中调用 server.close() 将不会抛出 SocketException。因此,下次我启动该服务时,我会收到“地址已在使用异常”。如果我使用 java.net.Socket 而不是 LocalServerSocket,那么我会得到所需的行为。我想知道为什么 LocalServerSocket 的行为与 Java 套接字不同。就我而言,我如何退出 while 循环。
最佳答案
我遇到了同样的问题,并以这种方式“解决”了它。线程 run() 方法正在检查“!isInterrupted()”。我添加到我的 Listener-Thread 的方法“stopSocketServer()”将线程标记为 interrupt(),然后向自身发出连接请求以触发 accept() 方法。
/**
* Executed if thread is started.
*/
public void run() {
try {
// leave while loop if thread is marked for interrupt.
while (!isInterrupted()) {
LocalSocket clientSocket = serverSocket.accept();
if (!isInterrupted()) {
threadPool.execute(new ClientProcessor(clientSocket));
}
}
} catch (IOException e) {
if (!isInterrupted()) {
Log.e(TAG, "socket listener terminated", e);
}
} finally {
try {
if (serverSocket != null) {
serverSocket.close();
}
if (threadPool != null) {
threadPool.shutdownNow();
}
Log.i(TAG, "socket listener stopped");
} catch (IOException e) {
}
}
}
public void stopSocketServer() {
if (serverSocket != null) {
try {
// mark thread as interrupted
interrupt();
// now send connect request to myself to trigger leaving accept()
LocalSocket ls = new LocalSocket();
ls.connect(serverSocket.getLocalSocketAddress());
ls.close();
} catch (IOException e) {
Log.e(TAG, "stopSocketServer failed", e);
}
}
}
关于Java ServerSocket 和 Android LocalServerSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8007982/
在android中,有两个类LocalServerSocket和LocalSocket。我认为它们类似于 unix 套接字中的 AF_LOCAL(我不确定它是否正确)。 我的问题是:是否可以在 Jav
如何中止/中断 LocalServerSocket 在后台线程中等待方法 LocalServerSocker.accept() 中的连接? 我试过从另一个线程调用 close() 方法,但它似乎不起作
我实现了自己的android服务如下 public class MyService extends Service { private static final String TAG = "M
我试图理解套接字,我看到这个基本的类初始化是这样的 LocalServerSocket ls = new LocalServerSocket("mycomputer"); “我的电脑”代表什么? 我阅
是否有人对异常“再试一次”有更多有用的信息? 我正在使用 LocalServerSocket 和 LocalSocket 在应用之间发送位图: 输出: socket = new LocalSocket
我的应用非常简单。客户端将连接到 LocalServerSocket(Unix 域套接字)并发送一些数据并断开连接。如果这个过程重复超过 1024 次,服务器在接受新客户端时抛出 java.io.IO
我是一名优秀的程序员,十分优秀!