如何优雅地关闭一个socket】的更多相关文章

最近在windows编程时需要考虑到“如何优雅地关闭一个socket”,查阅了一些资料,现将查到的相关资料做个汇编,希望能对后来者有所帮助(比较懒,所以英文资料没有翻译:-)) 1. 关闭Socket时究竟做了什么 关闭socket分为主动关闭(Active closure)和被动关闭(Passive closure)两种情况.前者是指有本地主机主动发起的关闭:而后者则是指本地主机检测到远程主机发起关闭之后,作出回应,从而关闭整个连接.    其状态图如下图所示: 起初每个socket都是CLO…
public class Connection { Socket _connection; public Connection(Socket socket) { _connection = socket; } public void WaitForSendData() { while (true) { ]; string data = ""; //等待接收消息 int bytesRec = this._connection.Receive(bytes); ) { ReceiveText…
Socket编程中,如何高效地接收和处理数据,这里介绍一个简单的编程模型. Socket索引 - SocketId 在给出编程模型之前,先提这样一个问题,程序中如何描述Socket连接? 为什么这么问呢,大家可以翻看我之前在项目总结(一)中给出的一个简单的基本架构,其中的网络层用来管理Socket的连接,并负责接收发送Socket数据,这个模块中可以直接使用建立的Socket连接对象.但如果上层需要给某个Socket发送数据怎么办,如果直接把Socket对象传送给上层,就破坏了面向对象中封装原则…
面试中经常会问到,创建一个线程池需要哪些参数啊,线程池的工作原理啊,却很少会问到线程池如何安全关闭的. 也正是因为大家不是很关注这块,即便是工作三四年的人,也会有因为线程池关闭不合理,导致应用无法正常stop的情况,还有出现一些报错的问题. 本篇就以ThreadPoolExecutor为例,来介绍下如何优雅的关闭线程池. 01 线程中断 在介绍线程池关闭之前,先介绍下Thread的interrupt. 在程序中,我们是不能随便中断一个线程的,因为这是极其不安全的操作,我们无法知道这个线程正运行在…
概述 本文通过一个最简单的Socket通信来对每一步做通俗易懂的讲解让你了解这些函数到底是干什么用的.下面的代码虽然是用Pyhton实现的,但是你要知道这些通信机制并不是Python所定义的,因为这些东西都必须符合通用规范.在类Unix操作系统上建立Socket也是这些步骤而Python其实就是使用的系统调用.同时本文包括关于Socket的基础知识,这些知识对于你去理解Socket很有帮助. 你的第一个Socket程序 基础知识 套接字:标识每个端点的IP和端口就叫做一个套接字.比如:(192.…
背景: 在Java编程过程中,如果打开了外部资源(文件.数据库连接.网络连接等),我们必须在这些外部资源使用完毕后,手动关闭它们.因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制,如果我们不在编程时确保在正确的时机关闭外部资源,就会导致外部资源泄露,紧接着就会出现文件被异常占用,数据库连接过多导致连接池溢出等诸多很严重的问题. 传统关闭资源方式(一般JDK版本低于1.7) /** * 根据路径创建文件,如果路径文件夹不存在,就创建 * @param filePath * @return…
Channel关闭原则 不要在消费端关闭channel,不要在有多个并行的生产者时对channel执行关闭操作. 也就是说应该只在[唯一的或者最后唯一剩下]的生产者协程中关闭channel,来通知消费者已经没有值可以继续读了.只要坚持这个原则,就可以确保向一个已经关闭的channel发送数据的情况不可能发生. 暴力关闭channel的正确方法 如果想要在消费端关闭channel,或者在多个生产者端关闭channel,可以使用recover机制来上个保险,避免程序因为panic而崩溃. func…
How to Gracefully Close Channels,这篇博客讲了如何优雅的关闭channel的技巧,好好研读,收获良多. 众所周知,在golang中,关闭或者向已关闭的channel发送数据都会引发panic. 谨遵优雅关闭channel的原则 不要在接受一端关闭channel 不要在有多个并发的senders中关闭channel.反过来说,如果只有一个协程充当sender,那么我们可以在这个sender协程内关闭掉channel. 一个简单的方法 SafeClose type M…
原文:https://www.cnblogs.com/itZhy/p/7636615.html 一.背景 我们知道,在Java编程过程中,如果打开了外部资源(文件.数据库连接.网络连接等),我们必须在这些外部资源使用完毕后,手动关闭它们.因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制,如果我们不在编程时确保在正确的时机关闭外部资源,就会导致外部资源泄露,紧接着就会出现文件被异常占用,数据库连接过多导致连接池溢出等诸多很严重的问题. 二.传统的资源关闭方式 为了确保外部资源一定要被关闭,…
一.背景 我们知道,在Java编程过程中,如果打开了外部资源(文件.数据库连接.网络连接等),我们必须在这些外部资源使用完毕后,手动关闭它们.因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制,如果我们不在编程时确保在正确的时机关闭外部资源,就会导致外部资源泄露,紧接着就会出现文件被异常占用,数据库连接过多导致连接池溢出等诸多很严重的问题. 二.传统的资源关闭方式 为了确保外部资源一定要被关闭,通常关闭代码被写入finally代码块中,当然我们还必须注意到关闭资源时可能抛出的异常,于是变有…