`
cuizhenfu#gmail.com
  • 浏览: 67500 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

如何关闭一个正在accept的ServerSocket?

阅读更多
加入一个ServerSocket正在另一个线程堵塞accept,那如何停止accept或者关闭Socket?

Server socket 设置下超时
setSoTimeout
然后在Listen线程中用interrupt

其实直接close socket也可以,不过会抛出异常,我的意思是有什么比较安全而又简单的办法?难道要加一个标志,然后要关闭的时候把标志设为stop,然后连接listernSocket?这样也未免太麻烦了

JDK5.0里面新增了java.util.concurrent包(对于多线程的开发建议尽量使用这个包),下面是javadoc里面的样例代码

用法示例

下面给出了一个网络服务的简单结构,这里线程池中的线程作为传入的请求。它使用了预先配置的 Executors.newFixedThreadPool(int) 工厂方法:
java 代码
 
  1. class NetworkService implements Runnable {  
  2.    private final ServerSocket serverSocket;  
  3.    private final ExecutorService pool;  
  4.   
  5.    public NetworkService(int port, int poolSize)  
  6.        throws IOException {  
  7.      serverSocket = new ServerSocket(port);  
  8.      pool = Executors.newFixedThreadPool(poolSize);  
  9.    }  
  10.   
  11.    public void run() { // run the service  
  12.      try {  
  13.        for (;;) {  
  14.          pool.execute(new Handler(serverSocket.accept()));  
  15.        }  
  16.      } catch (IOException ex) {  
  17.        pool.shutdown();  
  18.      }  
  19.    }  
  20.  }  
  21.   
  22.  class Handler implements Runnable {  
  23.    private final Socket socket;  
  24.    Handler(Socket socket) { this.socket = socket; }  
  25.    public void run() {  
  26.      // read and service request on socket  
  27.    }  
  28. }  

下列方法分两个阶段关闭 ExecutorService。第一阶段调用 shutdown 拒绝传入任务,然后调用 shutdownNow(如有必要)取消所有遗留的任务:
java 代码
 
  1. void shutdownAndAwaitTermination(ExecutorService pool) {  
  2.   pool.shutdown(); // Disable new tasks from being submitted  
  3.   try {  
  4.     // Wait a while for existing tasks to terminate  
  5.     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {  
  6.       pool.shutdownNow(); // Cancel currently executing tasks  
  7.       // Wait a while for tasks to respond to being cancelled  
  8.       if (!pool.awaitTermination(60, TimeUnit.SECONDS))  
  9.           System.err.println("Pool did not terminate");  
  10.     }  
  11.   } catch (InterruptedException ie) {  
  12.     // (Re-)Cancel if current thread also interrupted  
  13.     pool.shutdownNow();  
  14.     // Preserve interrupt status  
  15.     Thread.currentThread().interrupt();  
  16.   }  
  17. }  

内存一致性效果:线程中向 ExecutorService 提交 RunnableCallable 任务之前的操作 happen-before 由该任务所提取的所有操作,后者依次 happen-before 通过 Future.get() 获取的结果。

分享到:
评论

相关推荐

    serverSocket

    1. **实例化ServerSocket**:首先,我们需要创建一个`ServerSocket`对象,指定一个端口号。例如: ```java ServerSocket serverSocket = new ServerSocket(8080); ``` 这行代码会在本地主机的8080端口上打开一个...

    Socket+ServerSocket代码

    当有客户端尝试连接时,ServerSocket的accept()方法会被阻塞,直到一个连接建立为止。 接下来,我们讨论Socket类。Socket是Java.net包中的另一个重要类,它表示网络上的两个进程间通信的连接。在客户端,我们需要...

    socket-ServerSocket例子

    `ServerSocket`是Java中的服务器端套接字类,它允许服务器创建一个监听特定端口的套接字,等待客户端的连接请求。`ServerSocket`的基本用法如下: ```java import java.net.ServerSocket; import java.io....

    ServerSocket的小程序

    这个“ServerSocket的小程序”很可能是一个简单的网络聊天应用程序,由`ChatServer`和`ChatClient`两个主要部分组成。让我们深入探讨`ServerSocket`的工作原理以及这两个Java文件可能实现的功能。 `ServerSocket`类...

    ServerSocket用法详解

    创建一个`ServerSocket`实例时,通常需要指定一个端口号,这将决定服务器监听的通信通道。例如: ```java ServerSocket serverSocket = new ServerSocket(8080); ``` 这里的8080是服务器的端口号,选择一个未被...

    一个简单的socket/serversocket例子

    在服务器端,我们通常会创建一个ServerSocket实例,指定一个端口号,然后调用其`accept()`方法来监听并接受来自客户端的连接。当有客户端连接时,`accept()`方法会返回一个新的Socket对象,表示这个特定的连接。例如...

    Android ServerSocket

    因为`accept()`方法会阻塞,如果希望同时处理多个客户端,需要在一个单独的线程中调用`accept()`。这可以保证服务器不会因为等待一个连接而忽略其他客户端的请求。 7. **异常处理**: 在实现过程中,务必处理可能...

    Java多线程_ServerSocket服务端与客户端通信案例

    3. 主线程返回到ServerSocket的accept方法继续等待下一个客户端的连接请求。 4. 这样,主线程可以持续接收新的客户端连接请求,而各个子线程分别处理各自客户端的请求。 通过以上步骤,我们可以实现一个基本的多...

    Socket与ServerSocket编程实践聊天

    1. **创建ServerSocket**:服务器启动时,首先创建一个ServerSocket实例,并指定一个端口号。例如: ```java ServerSocket serverSocket = new ServerSocket(12345); ``` 2. **监听连接**:使用ServerSocket的`...

    BCB6中ServerSocket控件的使用

    在BCB6(Borland C++ Builder 6)中,ServerSocket控件是一个非常重要的网络编程工具,它用于创建服务器端的套接字,使得客户端可以与之建立连接进行数据交换。ServerSocket控件是基于TCP/IP协议的,因此适用于需要...

    Android ServerSocket 示例

    在Android平台上创建一个`ServerSocket`示例是一个有趣且实用的技术挑战,因为它涉及到网络通信,这对于移动设备来说并不常见。`ServerSocket`是Java提供的一个类,用于在服务器端建立监听套接字,等待客户端的连接...

    ServerSocket类.pdf

    - **连接**:当一个连接请求到达时,`accept()`方法返回一个新的`Socket`对象,服务器可以通过这个`Socket`与客户端进行通信。 - **通信**:使用`Socket`的输入/输出流与客户端进行数据交换。 - **关闭**:完成通信...

    ServerSocket

    `ServerSocket`是Java编程语言中的一个核心类,位于`java.net`包中,它用于在服务器端创建监听网络连接的套接字。这个类在分布式系统和网络编程中扮演着重要角色,允许服务器接收来自客户端的连接请求。在本文中,...

    as3 Air ServerSocket

    本文将详细介绍如何利用 AS3 和 Adobe AIR 的 `ServerSocket` 类来实现一个支持 WebSocket 协议的服务端应用。此示例代码片段展示了基本的设置步骤,并提供了关于如何处理客户端连接以及如何解析 WebSocket 握手请求...

    Test_ServerSocket.zip

    在这个"Test_ServerSocket.zip"压缩包中,我们很显然会探讨如何使用Socket实现一个服务器端,来处理多个客户端的连接和通信。这个场景对于初学者来说是极其有价值的,因为它能帮助理解网络通信的基本原理和Socket...

    ServerSocket ClientSock 应用实例

    创建一个`ServerSocket`对象时,通常需要指定一个端口号。例如: ```java ServerSocket server = new ServerSocket(8080); ``` 这行代码会创建一个监听8080端口的服务器。一旦有客户端尝试连接,`ServerSocket`就...

    java-chatroom.rar_java ServerSocket

    - 由于ServerSocket的accept()方法是阻塞的,因此为了同时处理多个客户端的连接,服务器端通常会为每个连接创建一个新的线程。这样,即使服务器正在处理某个客户端的请求,也能接收其他客户端的连接。 7. **安全性...

    socket serverSocket

    在Java编程语言中,`ServerSocket`和`Socket`是实现网络通信的核心类,它们用于构建客户端/服务器架构的应用程序,比如一个简单的聊天系统。在这个系统中,`ServerSocket`扮演服务器端的角色,监听特定端口上的连接...

    ServerSocket_demo

    首先,`ServerSocket`类位于`java.net`包下,它的主要职责是监听指定的端口号,当有客户端通过TCP协议发起连接请求时,`ServerSocket`会创建一个`Socket`对象来与之建立连接。在创建`ServerSocket`实例时,通常需要...

Global site tag (gtag.js) - Google Analytics