Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在关闭服务器SocketChannel.accept()检索到的SocketChannel_Java - Fatal编程技术网

Java 正在关闭服务器SocketChannel.accept()检索到的SocketChannel

Java 正在关闭服务器SocketChannel.accept()检索到的SocketChannel,java,Java,我在守护进程线程上有一个计时器,它不断地将数据写入一个进程。在main类中,我没有这个套接字通道的对象引用,但是我有这个套接字通道所连接的对象的引用。所以我这样做是为了关闭频道 socketChannel = serverSocket.accept(); socketChannel.close(); 但是在deamon线程的套接字通道关闭中有一个延迟。尽管它们都引用同一个套接字通道,但即使在调用上述close()后几毫秒,计时器任务仍会写入该套接字通道 请建议如何确保完成结算。这是一个非阻塞通

我在守护进程线程上有一个计时器,它不断地将数据写入一个进程。在main类中,我没有这个套接字通道的对象引用,但是我有这个套接字通道所连接的对象的引用。所以我这样做是为了关闭频道

socketChannel = serverSocket.accept();
socketChannel.close();
但是在deamon线程的套接字通道关闭中有一个延迟。尽管它们都引用同一个套接字通道,但即使在调用上述
close()
后几毫秒,计时器任务仍会写入该套接字通道


请建议如何确保完成结算。这是一个非阻塞通道

您需要同步。在这些线程之间共享一些对象。然后你可以这样做:
socketChannel = serverSocket.accept();
socketChannel.close();
主线程:

synchronized(object){
    socketChannel = serverSocketChannel.accept()
    socketChannel.close(). 
}
守护进程线程:

synchronized(object){
    timerTask.write(socketChannel, data)
}

你需要同步。在这些线程之间共享一些对象。然后你可以这样做: 主线程:

synchronized(object){
    socketChannel = serverSocketChannel.accept()
    socketChannel.close(). 
}
守护进程线程:

synchronized(object){
    timerTask.write(socketChannel, data)
}

你的代码没有意义。该代码根本不“引用同一个套接字通道”,因此它不会关闭它:它接受一个新的套接字通道并关闭它,这也是没有意义的,至少对建立新连接的客户端来说是没有意义的,并且可能希望在其上提供某种服务,而不是立即关闭


您只需要安排对现有频道的引用可供需要关闭它的代码使用。这是编程101,根本不是一个网络问题。

您的代码没有意义。该代码根本不“引用同一个套接字通道”,因此它不会关闭它:它接受一个新的套接字通道并关闭它,这也是没有意义的,至少对建立新连接的客户端来说是没有意义的,并且可能希望在其上提供某种服务,而不是立即关闭


您只需要安排对现有频道的引用可供需要关闭它的代码使用。这是编程101,根本不是一个网络问题。

我不明白这一点,为什么要同步它们?我正在关闭正确的套接字通道,但问题是,在守护进程线程中,套接字在几毫秒后关闭,这是不正确的。如果一个线程中的某个事件发生的时间与另一个线程所需的时间稍有不同,那么我将尝试同步该事件。你为什么不试试呢?你确定你测量的力矩正确吗?我不明白这一点,为什么它们应该同步?我正在关闭正确的套接字通道,但问题是,在守护进程线程中,套接字在几毫秒后关闭,这是不正确的。如果一个线程中的某个事件发生的时间与另一个线程所需的时间稍有不同,那么我将尝试同步该事件。你为什么不试试呢?你确定你测量的力矩正确吗?嗨,很欣赏你称之为101的方式,但是你能验证你的陈述吗?你说serversocketchannel.accept()返回的对象是一个新通道吗?那么你能证明该客户端的连接发生在哪里吗?@user915534是的。accept()返回的SocketChannel是来自客户端的新传入连接。这就是形成传入连接的地方。您的代码创建了两个SocketChannel:一个来自accept(),它是来自客户端的传入连接,另一个来自SocketChannel.open(),它是从服务器到自身的连接。它们是不同的。您好,很欣赏您称之为101的方式,但是您能验证您的语句吗?您是说serversocketchannel.accept()返回的对象是一个新通道吗?那么你能证明该客户端的连接发生在哪里吗?@user915534是的。accept()返回的SocketChannel是来自客户端的新传入连接。这就是形成传入连接的地方。您的代码创建了两个SocketChannel:一个来自accept(),它是来自客户端的传入连接,另一个来自SocketChannel.open(),它是从服务器到自身的连接。他们是不同的。