加入一个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()
获取的结果。
分享到:
相关推荐
本地端口监听实现通过JAVA的ServerSocket类,创建ServerSocket对象并绑定要监听的本地端口,然后通过accept()方法接受连接请求,在新线程中处理请求。具体代码如下: ServerSocket ss = new ServerSocket(6666); //监听...
anoHTTPD是个很简单的http服务器 简单到只有一个java文件 主要原理是用ServerSocket接受请求 对每一个请求的Socket创建一个线程去处理(HTTPSession) 线程内保存Socket 用Properties保存切割出来的head信息和url后...
a) 创建一个ServerSocket对象 b) 调用accept()方法接受客户端请求 c) 从Socket中获取I/O流 d) 对I/O流进行读写操作,完成与客户端的交互 e) 关闭I/O流和Socket ② 创建TCP客户端步骤: a) 创建一个Socket对象 ...
**1、** 服务器程序创建一个ServerSocket,然后再用accept方法等待客户来连接 **2、** 客户端程序创建一个Socket并请求与服务器建立连接 **3、** 服务器接收客户的连接请求,并创建一个新的Socket与该客户建立专线...
socket = serversocket.accept(); ThreadTest tread = new ThreadTest(socket, num); tread.start(); System.out.println("客户号:" + num); } catch (IOException e) { e.printStackTrace(); } }
一个Socket实例代表了TCP连接的一个客户端,而一个ServerSocket实例代表了TCP连接的一个服务器端,一般在TCP Socket编程中,客户端有多个,而服务器端只有一个,客户端TCP向服务器端TCP发送连接请求,服务器端的...
第一步,创建一个serversocket类的对象。 第二步,建立侦听。建立侦听是由serversocket类的accept函数完成。 第三步,获取用于与远程客户端通信的outputstream对象和intputstream对象。 第四步,利用DataInputstream...
Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。 . ...
这是用Java创建一个简单的时间服务器的例子,类似于微软为Windows定制的时间服务器,用于校准时间。可以通过这个网络时间服务器了解一些套按字、输入流以及缓冲区方面的相关基础知识。服务器创建部分,可参考如下...
在上面代码中我们用了一个死循环,在循环体里面ServerSocket调用其accept方法试图接收来自客户端的连接请求。当没有接收到请求的时候,程序会在这里阻塞直到接收到来自客户端的连接请求,之后会跟当前建立好连接的...
服务器端用ServerSocket对象监听9999号端口,当客户端发出请求,服务器用ServerSocket的accept()接受请求并打开端口建立Socket连接,创建一个线程来管理这个连接(ChatThread对象)。每一个连接在服务器端都由一个...
当有客户端连接时,accept()方法会返回一个Socket对象 使用Socket对象进行数据传输 远程端口扫描的实现步骤如下: 创建Socket对象并指定远程主机和端口号 使用Socket对象进行数据传输 可以使用Java的网络编程库Nmap...
客户端软件通常使用java.net包中的核心类Socket与服务器的某个端口建立连接,而服务器程序不同于客户机,它需要初始化一个端口进行监听,遇到连接呼叫,才与相应的客户机建立连接。Java.net包的ServerSocket类包含了...
Socket client = serversocket.accept(); ServerRead sr1=new ServerRead(client); ServerWrite sw1=new ServerWrite(client); sr1.start(); sw1.start(); } }catch (IOException e) ...
它会进一步调用Accept(ReceiveSocket)来接收它,而此时服务器端还须建立一个新的CSocket对象,用它来和客户端进行交流。如下例: CSocket ReceiveSocket; ServerSocket.Accept(ReceiveSocket); (6)如果想在两个...
它会进一步调用Accept(ReceiveSocket)来接收它,而此时服务器端还须建立一个新的CSocket对象,用它来和客户端进行交流。如下例: CSocket ReceiveSocket; ServerSocket.Accept(ReceiveSocket); (6)如果想在两个...
① 服务器端创建ServerSocket,循环调用accept()等待客户端连接 ② 客户端创建一个socket并请求和服务器端连接 ③ 服务器端接受请求,创建socket与该客户建立专线连接 ④ 建立连接的两个socket在一个单独的线程上...
在 Java 中,基于 TCP 协议实现网络通信的类有两个,在客户端的 Socket 类和在服务器端的ServerSocket 类,ServerSocket 类的功能是建立一个 Server,并通过 accept()方法随时监听客户端的连接请求。 扩展: ...
Socket,又称套接字,在TCP/IP协议分层架构中,属应用层和传输层之间的一个抽象层(也有的说是属于传输层),它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。 ![在这里插入图片描述...
服务器采用多线程以满足多用户的请求,通过JDBC与后台数据库连接,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为8080,然后无限循环调用accept()方法接受客户程序的连接Q系统的设计于实现