加入一个ServerSocket正在另一个线程堵塞accept,那如何停止accept或者关闭Socket?
Server socket 设置下超时
setSoTimeout
然后在Listen线程中用interrupt
其实直接close socket也可以,不过会抛出异常,我的意思是有什么比较安全而又简单的办法?难道要加一个标志,然后要关闭的时候把标志设为stop,然后连接listernSocket?这样也未免太麻烦了
JDK5.0里面新增了java.util.concurrent包(对于多线程的开发建议尽量使用这个包),下面是javadoc里面的样例代码
用法示例
下面给出了一个网络服务的简单结构,这里线程池中的线程作为传入的请求。它使用了预先配置的
Executors.newFixedThreadPool(int)
工厂方法:
java 代码
- class NetworkService implements Runnable {
- private final ServerSocket serverSocket;
- private final ExecutorService pool;
-
- public NetworkService(int port, int poolSize)
- throws IOException {
- serverSocket = new ServerSocket(port);
- pool = Executors.newFixedThreadPool(poolSize);
- }
-
- public void run() {
- try {
- for (;;) {
- pool.execute(new Handler(serverSocket.accept()));
- }
- } catch (IOException ex) {
- pool.shutdown();
- }
- }
- }
-
- class Handler implements Runnable {
- private final Socket socket;
- Handler(Socket socket) { this.socket = socket; }
- public void run() {
-
- }
- }
下列方法分两个阶段关闭
ExecutorService。第一阶段调用
shutdown 拒绝传入任务,然后调用
shutdownNow(如有必要)取消所有遗留的任务:
java 代码
- void shutdownAndAwaitTermination(ExecutorService pool) {
- pool.shutdown();
- try {
-
- if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
- pool.shutdownNow();
-
- if (!pool.awaitTermination(60, TimeUnit.SECONDS))
- System.err.println("Pool did not terminate");
- }
- } catch (InterruptedException ie) {
-
- pool.shutdownNow();
-
- Thread.currentThread().interrupt();
- }
- }
内存一致性效果:线程中向 ExecutorService
提交 Runnable
或 Callable
任务之前的操作 happen-before 由该任务所提取的所有操作,后者依次 happen-before 通过 Future.get()
获取的结果。
分享到:
相关推荐
1. **实例化ServerSocket**:首先,我们需要创建一个`ServerSocket`对象,指定一个端口号。例如: ```java ServerSocket serverSocket = new ServerSocket(8080); ``` 这行代码会在本地主机的8080端口上打开一个...
当有客户端尝试连接时,ServerSocket的accept()方法会被阻塞,直到一个连接建立为止。 接下来,我们讨论Socket类。Socket是Java.net包中的另一个重要类,它表示网络上的两个进程间通信的连接。在客户端,我们需要...
`ServerSocket`是Java中的服务器端套接字类,它允许服务器创建一个监听特定端口的套接字,等待客户端的连接请求。`ServerSocket`的基本用法如下: ```java import java.net.ServerSocket; import java.io....
这个“ServerSocket的小程序”很可能是一个简单的网络聊天应用程序,由`ChatServer`和`ChatClient`两个主要部分组成。让我们深入探讨`ServerSocket`的工作原理以及这两个Java文件可能实现的功能。 `ServerSocket`类...
创建一个`ServerSocket`实例时,通常需要指定一个端口号,这将决定服务器监听的通信通道。例如: ```java ServerSocket serverSocket = new ServerSocket(8080); ``` 这里的8080是服务器的端口号,选择一个未被...
在服务器端,我们通常会创建一个ServerSocket实例,指定一个端口号,然后调用其`accept()`方法来监听并接受来自客户端的连接。当有客户端连接时,`accept()`方法会返回一个新的Socket对象,表示这个特定的连接。例如...
因为`accept()`方法会阻塞,如果希望同时处理多个客户端,需要在一个单独的线程中调用`accept()`。这可以保证服务器不会因为等待一个连接而忽略其他客户端的请求。 7. **异常处理**: 在实现过程中,务必处理可能...
3. 主线程返回到ServerSocket的accept方法继续等待下一个客户端的连接请求。 4. 这样,主线程可以持续接收新的客户端连接请求,而各个子线程分别处理各自客户端的请求。 通过以上步骤,我们可以实现一个基本的多...
1. **创建ServerSocket**:服务器启动时,首先创建一个ServerSocket实例,并指定一个端口号。例如: ```java ServerSocket serverSocket = new ServerSocket(12345); ``` 2. **监听连接**:使用ServerSocket的`...
在BCB6(Borland C++ Builder 6)中,ServerSocket控件是一个非常重要的网络编程工具,它用于创建服务器端的套接字,使得客户端可以与之建立连接进行数据交换。ServerSocket控件是基于TCP/IP协议的,因此适用于需要...
在Android平台上创建一个`ServerSocket`示例是一个有趣且实用的技术挑战,因为它涉及到网络通信,这对于移动设备来说并不常见。`ServerSocket`是Java提供的一个类,用于在服务器端建立监听套接字,等待客户端的连接...
- **连接**:当一个连接请求到达时,`accept()`方法返回一个新的`Socket`对象,服务器可以通过这个`Socket`与客户端进行通信。 - **通信**:使用`Socket`的输入/输出流与客户端进行数据交换。 - **关闭**:完成通信...
`ServerSocket`是Java编程语言中的一个核心类,位于`java.net`包中,它用于在服务器端创建监听网络连接的套接字。这个类在分布式系统和网络编程中扮演着重要角色,允许服务器接收来自客户端的连接请求。在本文中,...
本文将详细介绍如何利用 AS3 和 Adobe AIR 的 `ServerSocket` 类来实现一个支持 WebSocket 协议的服务端应用。此示例代码片段展示了基本的设置步骤,并提供了关于如何处理客户端连接以及如何解析 WebSocket 握手请求...
在这个"Test_ServerSocket.zip"压缩包中,我们很显然会探讨如何使用Socket实现一个服务器端,来处理多个客户端的连接和通信。这个场景对于初学者来说是极其有价值的,因为它能帮助理解网络通信的基本原理和Socket...
创建一个`ServerSocket`对象时,通常需要指定一个端口号。例如: ```java ServerSocket server = new ServerSocket(8080); ``` 这行代码会创建一个监听8080端口的服务器。一旦有客户端尝试连接,`ServerSocket`就...
- 由于ServerSocket的accept()方法是阻塞的,因此为了同时处理多个客户端的连接,服务器端通常会为每个连接创建一个新的线程。这样,即使服务器正在处理某个客户端的请求,也能接收其他客户端的连接。 7. **安全性...
在Java编程语言中,`ServerSocket`和`Socket`是实现网络通信的核心类,它们用于构建客户端/服务器架构的应用程序,比如一个简单的聊天系统。在这个系统中,`ServerSocket`扮演服务器端的角色,监听特定端口上的连接...
首先,`ServerSocket`类位于`java.net`包下,它的主要职责是监听指定的端口号,当有客户端通过TCP协议发起连接请求时,`ServerSocket`会创建一个`Socket`对象来与之建立连接。在创建`ServerSocket`实例时,通常需要...