stopServer()服务器在Mac,Linux和UNIX计算机上完美工作,但是当我尝试在Windows上closures时,我发现由于ServerSocket的超时, 每个套接字要closures至less需要一秒。 我想让他们像在Linux,Mac等一样closures所有,而不是在我调用Thread.join() 。
服务器代码
public class FileServer { private ArrayList<Thread> sockets = new ArrayList<>(); private ServerSocket fileServer; public void startServer(int port,int maxThreads,int timeout) throws IOException { fileServer = new ServerSocket(); fileServer.setPerformancePreferences(1,1); fileServer.bind(new InetSocketAddress(port)); for (int threads = 0; threads < maxThreads; threads++) { sockets.add(new Thread(new ServerInit(fileServer,timeout))); System.out.println("Socket " + threads + " initialized..."); } for (int socket = 0; socket < sockets.size(); socket++) { (sockets.get(socket)).start(); System.out.println("Socket " + socket + " started!"); } } public void stopServer() { if (fileServer.isBound()) { for (int thread = 0; thread < sockets.size(); thread++) { sockets.get(thread).interrupt(); } for (int thread = 0; thread < sockets.size(); thread++) { try { if (sockets.get(thread).isAlive()) { sockets.get(thread).join(); } } catch (Exception e) { e.printstacktrace(); } } } } } class ServerInit implements Runnable { private ServerSocket server; private int timeout; public ServerInit(ServerSocket server,int timeout) { this.server = server; this.timeout = timeout; } public void run() { while (!Thread.interrupted()) { try { server.setSoTimeout(1000); Socket client = server.accept(); client.setSoTimeout(timeout); processRequest(receiveRequest(client),client); client.close(); } catch (SocketTimeoutException ste) { } catch (IOException io) { io.printstacktrace(); } } System.out.println("Socket closed"); } }
为什么线程要求我在joinwhile循环之前join它们? 我已经testing并确信每个线程都正在启动,并且每个线程都被正确中断。
此外,只有一个线程将打印正确,如果我把System.out.println()在循环。
把数据放回套接字缓冲区
如何处理Linux套接字revellent POLLERR,POLLHUP和POLLNVAL?
缓冲区溢出会发生什么?
TCP消息框架+ recv():良好的约定?
编辑
我更意识到,它必须等待accept超时。 这是打算,因此只有一秒超时。 这一切在其他平台上完美运作 。 我正在中断所有的线程,然后join他们,以确保他们实际上停止。 我最关心的是为什么这些线程不能同时按照它们的时间同步。
处理需要访问特权端口<1024的应用程序的标准方式是什么?
数据报pipe道可以在Linux?
OS X getsockopt:不是SO_PROTOCOL
Linux,了解setsockopt()PACKET_FANOUTnetworking缩放
对于* nix操作系统,套接字实现在任何地方都不会锁定accept 。
对于Windows, PlainSocketImpl类将accept定义为synchronized :
protected synchronized void accept(SocketImpl s) throws IOException { // ... }
accept是一次只能由一个线程执行的。 在最终获取锁之后,1秒超时仅由本地accept计入。
我不能说这是否是故意的,你必须在Java邮件列表中询问。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。