我已经从这个带有多线程服务器的例子中获得了android:
http://tutorials.jenkov.com/java-multithreaded-servers/singlethreaded-server.html
但是我在理解部分代码时遇到了一些困难:
while(! isStopped()) {
Socket clientSocket = null;
try {
clientSocket = this.serverSocket.accept();
} catch (IOException e) {
if (isStopped()) {
System.out.println("Server Stopped.") ;
return;
}
throw new RuntimeException("Error accepting client connection", e);
}
我不明白的是,当我在这一行有异常时会发生什么:
clientSocket = this.serverSocket.accept();
据我所知,这个函数被调用:
private synchronized boolean isStopped() {
return this.isStopped;
}
但如何关闭该套接字?如果您在尝试接受客户端时遇到异常,则应该关闭accept返回的套接字。
我认为这是在这里完成的:
public synchronized void stop() {
this.isStopped = true;
try {
this.serverSocket.close();
} catch (IOException e) {
throw new RuntimeException("Error closing server", e);
}
}
但stop()
在哪里被调用,如何在isStopped()
和onStop()
之间建立联系....那么“同步”是什么?
希望我已经清楚我的不清楚了!提前谢谢你:)
答案 0 :(得分:1)
你可能已经离开了,但后人......
当我在此行有例外时会发生什么
clientSocket = this.serverSocket.accept();
如果在accept中出现异常,则不会返回任何套接字,因此无法关闭任何内容。 accept()
返回应该处理的有效套接字,然后关闭或它会引发异常。从来没有。
在哪里调用
stop()
?
一些想要关闭服务器套接字的调用者从外部调用停止看起来。使用服务器,您可以创建服务器套接字,然后接受与远程客户端的单独连接,这将返回该客户端的套接字。每个客户端处理程序都需要关闭自己的各个连接。当服务器关闭时(在这种情况下调用stop()
时),服务器套接字将关闭。
调用stop()
后,服务器套接字将关闭,accept()
方法将引发异常。这就是为什么在代码中进行if(isStopped())
检查以避免抛出异常。
如何在
之间建立联系isStopped()
和onStop()
isStopped()
是一个私有方法,用于测试某人是否调用了stop()
方法。我假设onStop()
是Android方法?虽然有人可能想在singleThreadedServer.stop()
内拨打onStop()
,但它们并不相关。
synchronized
是什么?
synchronized线程程序将synchronized关键字用作互斥锁和内存屏障。它只允许1个线程一次在synchronized
块内执行。它还确保所有局部变量在线程和中央内存之间同步。请参阅java docs:
http://download.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html
让私有方法同步真的是IMO。我认为这样做是为了确保isStopped
已更新。我会使用volatile
布尔值或AtomicBoolean
代替。