Java 网络编程 —— 实现非阻塞式的客户端

创建阻塞的 EchoClient

客户程序一般不需要同时建立与服务器的多个连接,因此用一个线程,按照阻塞模式运行就能满足需求

public class EchoClient {
    
    private SocketChannel socketChannel = null;
    
    public EchoClient() throws IOException {
        socketChannel = SocketChannel.open();
        InetAddress ia = InetAddress,getLocalHost();
        InetSocketAddress isa = new InetSocketAddress(ia,8000);
        socketChannel.connect(isa); //连接服务器
    }
    
    public static void main(String args[])throws IOException {
        new EchoClient().talk();
    }
    
    private PrintWriter getWriter(Socket socket) throws IOException {
        OutputStream socketOut = socket.getOutputStream();
        return new PrintWriter(socketOut,true);
    }
    
    private BufferedReader getReader(Socket socket) throws IOException {
        InputStream socketIn = socket.getInputStream();
        return new BufferedReader(new InputStreamReader(socketIn));
    }
    
    public void talk() throws IOException {
        try {
            BufferedReader br = getReader(socketChannel.socket());
            PrintWriter pw = getWriter(socketChannel.socket());
            
            BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));
            
            String msq = null;
            
            while((msg = localReader.readLine()) != null) {
                pw.println(msg);
                System.out.println(br.readLine());
                if(msq.equals("bye")) {
                    break;
                }
            }
        } catch(IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socketChannel.close();
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    }
}

创建非阻塞的 EchoClient

对于客户与服务器之间的通信,按照它们收发数据的协调程度来区分,可分为同步通信和异步通信

同步通信指甲方向乙方发送了一批数据后,必须等接收到了乙方的响应数据后,再发送下一批数据。同步通信要求一个 IO 操作完成之后,才能完成下一个 IO 操作,用阻塞模式更容易实现

异步通信指发送数据和接收数据的操作互不干扰,各自独立进行。异步通信允许发送数据和接收数据的操作各自独立进行,用非阻塞模式更容易实现

值得注意的是,通信的两端并不要求都采用同样的通信方式,当一方采用同步通信时,另一方可以采用异步通信

public class EchoClient {
    
    private SocketChannel socketChannel = null;
    private ByteBuffer sendBuffer = ByteBuffer.allocate(1024);
    private ByteBuffer receiveBuffer = ByteBuffer.allocate(1024);
    private Charset charset = Charset.forName("GBK");
    private Selector selector;
    
    public EchoClient() throws IOException {
        socketChannel = SocketChannel.open();
        InetAddress ia = InetAddress.getLocalHost();
        InetSocketAddress isa = new InetSocketAddress(ia, 8000);
        socketChannel.connect(isa); //采用阻塞模式连接服务器
        socketChannel.configureBlocking(false); //设置为非阻塞模式
        selector = Selector.open();
    }
    
    public static void main(String args[]) throws IOException {
        final EchoClient client = new EchoClient();
        Thread receiver=new Thread() {
         	public void run() {
                client.receiveFromUser(); //接收用户向控制台输入的数据
            }   
        };
        receiver.start();
        client.talk();
    }
    
    /** 接收用户从控制台输入的数据,放到sendBuffer中 */
    public void receiveFromUser() {
        try {
            BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));
            String msg = null;
            while((msg = localReader.readLine()) != null) {
                synchronized(sendBuffer) {
                    sendBuffer.put(encode(msg + "\r\n"));
                }
                if (msg.equals("bye")) {
                    break;
                }
            }
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
    
    //接收和发送数据
    public void talk() throws IOException {
        socketChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
        while (selector.select() > 0 ) {
            Set readyKeys = selector.selectedKeys();
            Iterator it = readyKeys.iterator();
            while (it.hasNext()) {
                SelectionKey key = null;
                try {
                    key = (SelectionKey) it.next();
                    it.remove();
                    if (key.isReadable()) {
                        receive(key);
                    }
                    if (key.isWritable()) {
                        send(key);
                    }
                } catch(IOException e) {
                    e.printStackTrace();
                    try {
                        if(key != null) {
                            key.cancel();
                            key.channel().close() ;
                        }
                    } catch(Exception ex) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    public void send(SelectionKey key) throws IOException {
        //发送sendBuffer的数据
        SocketChannel socketChannel = (SocketChannel)key.channel();
        synchronized(sendBuffer) {
            sendBuffer.flip(); //把极限设为位置,把位置设为0
            socketChannel.write(sendBuffer); //发送数据
            sendBuffer.compact(); //删除已经发送的数据
        }
    }
    
    public void receive(SelectionKey key) throws IOException {
        //接收EchoServer发送的数据,把它放到receiveBuffer
        //如果receiveBuffer有一行数据,就打印这行数据,然后把它从receiveBuffer删除
        SocketChannel socketChannel = (SocketChannel) key.channel();
        socketChannel.read(receiveBuffer):
        
        receiveBuffer.flip();
        String receiveData = decode (receiveBuffer);
        
        if(receiveData.indexOf("\n") == -1) return;
        
        String outputData = receiveData.substring(0, receiveData.indexOf("\n") + 1):
        
        System.out.print(outputData);
        
        if(outputData.equals("echo:bye\r\n")) {
            key.cancel():
            socketChannel.close();
            selector.close();
            System.exit(0);
        }
        
        ByteBuffer temp = encode(outputData);
        receiveBuffer.position(temp.limit());
        receiveBuffer.compact(): //删除已经打印的数据
    }
    
    //解码
    public String decode(ByteBuffer buffer) { 
        CharBuffer charBuffer= charset.decode(buffer);
        return charBuffer.toString();
    }
    	
    //编码
	public ByteBuffer encode(String str) {
        return charset.encode(str);
    }
}

本文转载于网络 如有侵权请联系删除

相关文章

  • 企业品牌型网站建设的三点好处

    大家都知道营销型网站建设对企业的重要性,因此现在互联网上营销型网站有很多,而相对而言,品牌型企业网站比较少,但是还是有部分企业意识到了品牌企业网站建设的好处,品牌型企业网站,一句话简单来说就是帮助企业宣传品牌。下面易极赞自助建站小编总结了建设此类型网站的三点好处。一、品牌知名度得以提升企业最担心的事情就是企业成立已经很久,但是却很少有人记住甚至都不知道这个牌子,相信这是企业都不愿意看到的事情。那么企业在盈利之后,接下来的工作应该放在品牌塑造上,从多个方面向用户讲述企业品牌文化,让用户知道买这种产品应该认准这个牌子。众所周知传统线下广告费用高,不太适合中小企业。而如果建立一个企业品牌网站,建站费用低,推广费用也比较低,能够在短时间内让企业品牌被大家熟知并得到市场用户认可。二、产品价值得以提高企业品牌一旦达到了一定高度之后,就可以为自己企业产品增加价值,要知道很多大牌衣服之所以那么贵,是因为他们品牌所带来的效益,因此,企业产品想要变成高端产品,就一定要打造好自己的品牌,品牌型企业网站内容都是由资深文案撰写,内容突出企业文化和价值,使品牌档次提升,企业产品印上了高端LOGO之后自然价格就会上

  • Maven环境搭建

    传统的java项目是什么模式? 在我读大学那会,那个时候学java,用java来开发项目的话,一般都会在自己项目下新建一个libs的文件夹,然后把所需要用到的第三方jar包放到libs目录下面去,并且以后的项目大都是前后端未分离的模式,项目成员之间要共享代码的话,这些第三方的jar包都要传到git或者svn仓库上去,这样会导致仓库里面项目文件大小非常庞大,也不便于对jar包版本的管理。maven是什么? maven一个jar包的依赖管理工具。直到第一份工作,在工作中接触到了maven,才发现它的好处。有了maven之后,再也不用在项目中上传jar包进去了,只需要在一个pom.xml格式的文件里面配置好每个jar包的名称和对应的版本号就行,编译的时候会自动从仓库去下载所需要的jar包到自己本地,pom.xml中对单个jar包的配置格式如下所示: <!--https://mvnrepository.com/artifact/org.testng/testng--> <dependency> <groupId>org.testng</groupId&

  • (NXP)LS1012 LS1043 LS1046 LS1028 性能PK对比-飞凌嵌入式

    在恩智浦丰富的处理器产品组合中,Layerscape通信处理器是非常重要的一个产品系列。该系列处理器基于Arm内核技术,涵盖广泛的性能范围,从最小规格、功率受限的网络和工业应用,到需要高级数据通路和网络外设接口的新型虚拟化网络和嵌入式系统等应用,都可以提供最适合的产品。在5G和工业互联网的大背景推动下,恩智浦的合作伙伴也推出了不少基于Layerscape通信处理器核心板,比如飞凌嵌入式就先后推出的FET1012A-C、FET1043A-C、FET1046A-C、FET1028A-C四款核心板,这几款核心板都采用了LayerscapeLS10XX通信处理器,在网络吞吐性能方面优势明显,而且原生网口数量也比较多,像FET1046A-C最多可以支持8个千兆网口。但面对这一深度和广度俱佳的产品组合,如果对这个系列平台不是太了解的话,选型时难免有一些困惑,在此我们将这四款核心板做一次横向对比与纵向解析,让大家对这几款产品有更清晰和全面的认识,了解它们各自的优势,在选型时才能更准确。功能对比注1:功能引脚有复用关系,表中数据是CPU内部具备的某个外设控制器的最大数量,实际要根据引脚功能配置决定。注

  • SWA2G422&485JK2G基础篇: STM32+W5500实现MQTT通信控制,485/422透传通信

    说明  这节实现的功能:  STM32+W5500实现MQTT通信控制  细节功能:  1.DHCP动态获取IP  2.DNS域名解析  3.网口<--MQTT-->485/422透传通信测试准备工作  注:如果想连接自己的服务器测试,请修改为自己的MQTT连接信息  一,按照下面方式短接通信端口    电脑串口<-->STM32串口1    422/485<-->STM32串口3  二,连接网线(网线另一端连接可以上网的路由器或者交换机)  三,连接485/422通信模块(任选一种即可,下面说明两种接线方式)    3.1: 485连接方式     3.1: 422连接方式  四,打开两个串口调试助手,分别监控STM32串口1和485/422的数据    4.1:单片机串口1监听配置    4.2:485/422通信口串口配置    注:之所以这样配置是由于后面章节测试与PLC远程通信所需.  五,打开MQTT调试助手    如果上面程序中修改了MQTT信息,此处请按照自己的修改  六,下载单片机程序    注:hex文件路径测试  一,正常状态下

  • Django之Model世界

    Model到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:创建数据库,设计表结构和字段使用MySQLdb来连接数据库,并编写数据访问层代码业务逻辑层去调用数据访问层执行数据库操作importMySQLdb defGetList(sql): db=MySQLdb.connect(user='root',db='wupeiqidb',passwd='1234',host='localhost') cursor=db.cursor() cursor.execute(sql) data=cursor.fetchall() db.close() returndata defGetSingle(sql): db=MySQLdb.connect(user='root',db='wupeiqidb',passwd='1234',host='localhost') cursor=db.cursor() cursor.exe

  • 如何高效学Python?

    如果你一直想学Python,但是不知道如何入手,那就别犹豫了。这篇文章就是为你写的。(由于微信公众号外部链接的限制,文中的部分链接可能无法正确打开。如有需要,请点击文末的“阅读原文”按钮,访问可以正常显示外链的版本。)疑问随着数据科学概念的普及,Python这门并不算新的语言火得一塌糊涂。因为写了几篇用Python做数据分析的文章,经常有读者和学生在留言区问我,想学习Python,该如何入手?我经常需要根据他们的不同情况,提出对应的建议。这样针对性虽强,但效率不高。这个问题,我还是写出来,让更多的人一同看到吧。有几位出版社的编辑,给我发私信,鼓励我赶紧写一本Python教材出来。我暂时还没有写Python基础教程的计划。因为在我看来,现有的学习资源已经足够好了。有现成的资源和路径,为什么许多人依然在为学Python犯愁呢?因为学习有个效率问题。Python语法清晰明快,简单易学。这是Python如此普及的重要原因。但是,选择合适的Python学习方式,需要跟你自身的特性相结合。人群划分的标准是什么?不是你是否计算机相关专业,也不是你是否已经工作,而是一个重要的指标——你的自律能力。你可

  • CAIL2021-阅读理解任务-数据预处理模块(一)

    1、任务介绍 该赛道由科大讯飞研究院与哈尔滨工业大学社会计算与信息检索研究中心承办。在法律问答任务中,很多问题需要通过文章中多个片段组合出最终的答案。因此,本次中文法律阅读理解比赛引入多片段回答的问题类型,即部分问题需要抽取文章中的多个片段组合成最终答案。希望多片段问题类型的引入,能够扩大中文机器阅读理解的场景适用性。本次比赛依旧保留单片段、是否类和拒答类的问题类型。 2、数据介绍 本任务技术评测的训练集包括两部分,一部分来源于CAIL2019和CAIL2020的训练集,一部分为重新标注的约4000个问答对的训练集。验证集和测试集分别约1500个问答对。第一阶段为小规模训练集和验证集,第二阶段为全量训练集和验证集,第三阶段使用测试集用于封测 赛题地址:http://cail.cipsc.org.cn/task1.html?raceID=0 代码地址:https://github.com/china-ai-law-challenge/CAIL2021/ 这里贴下部分数据: { "data":[ { "paragraphs":[ { "context":"经审

  • linux driver --- platform框架应用完整实例(未使用设备树)

    平台设备文件 button_device.c #include<linux/module.h> #include<linux/init.h> #include<linux/platform_device.h> staticvoidbutton_release(structdevice*dev) { printk("%s\n",__FUNCTION__); return; } structresourcebutton_resource[]={ { .start=0x20c406c, .end=0x20c406c+3,//IORESOURCE_MEM必须要加上end,不然会报错 .name="CCGR", .flags=IORESOURCE_MEM, }, { .start=0x229000c, .end=0x229000c+3, .name="SW_MUX_CTL", .flags=IORESOURCE_MEM, }, { .start=0x2290050, .end=0x2290050+3, .name="SW_PAD_CTL", .flags

  • webform 验证控件

        验证:一、非空验证 RequiredFieldValidatorErrorMessage-验证出错后的提示信息ControlToValidate-要验证的控件的IDDisplay-显示方式。Static-不显示也占空间。Dynamic-不显示不占空间InitialValue-验证的初始值,被验证控件的值与此值相同的话,就认为是空 场景:(一)填没填(二)初始值变没变:通过设置InitialValue来实现 二、对比验证CompareValidatorErrorMessage-验证出错后的提示信息ControlToValidate-要验证的控件的IDDisplay-显示方式。Static-不显示也占空间。Dynamic-不显示不占空间ControlToCompare-要对比的控件的IDValueToCompare-要对比的值Operator-对比的运算符Type-输入的对比类型 场景:1.两个控件的值进行对比。2.控件输入的值和固定值进行对比 三、范围验证RangeValidatorErrorMessage-验证出错后的提示信息ControlToVa

  • Linux c 开发-29 mosquitto库保持连接的两种方式

    方式1 while(1) { intrc=mosquitto_loop(mosq,-1,1); if(rc) { printf("mqtt_portal:mosquitto_looprc=%d\n",rc); sleep(1); mosquitto_reconnect(mosq); } } 复制 方式2 //循环处理网络消息 mosquitto_loop_forever(mosq,-1,1); 复制 方式1比起方式2优点是如果mosquitto服务器端口后,能够及时打印信息。 本博客是个人工作中记录,遇到问题可以互相探讨,没有遇到的问题可能没有时间去特意研究,勿扰。 另外建了几个QQ技术群: 2、全栈技术群:616945527,加群口令abc123 2、硬件嵌入式开发:75764412 3、Go语言交流群:9924600 闲置域名www.nsxz.com出售(等宽等高字符四字域名)。

  • PCB设计经验小总结

    1、单层板贴元件尽量采用大封装 波峰炉是整个板子浸在溶解的锡上,不适合焊接高密度元件,所以单层板不能放置焊盘间距小的元件(后续单层板不再用0402、0603封装的元件)。   目前的单层板FR-1不能通过回流焊炉焊接,因为此炉温度较高,持续时间长,过炉后会严重变形(下图),所以此类板工艺同样用贴片机帖装,点红胶固定,然后波峰炉焊接。 2、在开发板5mm内不设计元件,因为pcb的导轨宽度为3mm 预留工艺边宽度:统一要求至少保留5mm    3、托架护具,开口的地方是需要焊接的,保护的地方是底面贴好的贴片元件 4、单层板,手插件单个焊盘容易起皮怎么办? 单层板单个焊点会在过炉方向做延伸焊盘设计 5、PCB红胶工艺:https://www.zhihu.com/question/304785750/answer/550381964 SMT红胶工艺是利用红胶受热固化的特性,通过印刷机或点胶机,填充在两个焊盘的中间,然后通过贴片、回流焊完成固化焊接,最后,过波峰焊时表面贴装那面过波峰,并且无需治具完成焊接的过程。 6、HDMI、LVDS走100欧姆差分阻抗线。 U

  • python余弦相似度

    余弦相似度公式 \(\cos\alpha={\veca}{\cdot}{\vecb}{|\veca||\vecb|}\) 向量\(\veca\)与向量\(\vecb\)的余弦相似度等于,向量\(\veca\)与向量\(\vecb\)的点积,除以向量\(\veca\)与向量\(\vecb\)的长度 函数cos_sim计算了向量的余弦相似度,参数b为一个矩阵n\(\times\)m的矩阵,表示n个m维的向量。 defcos_sim(a,b): """ 计算a,b向量的余弦相似度 @parama:1*m的向量 @paramb:n*m的矩阵 @return:1*n的值,每个样本的bi与a的余弦相似度 """ cos_result=np.dot(a,b.T)/np.sqrt(np.sum(b**2,axis=1))/np.sqrt(np.dot(a,a.T)) returncos_result 复制

  • 2022-04-25内部群每日三题-清辉PMP

    1.项目章程批准之后,项目经理开始使用储备分析进行预算工作。哪些文件支持这项工作? A.项目资金需求、成本基准和项目储备计划 B.范围基准、风险登记册和项目进度计划 C.质量管理计划、项目资金需求和风险登记册 D.范围基准、时间基准和批准的变更请求 2.在预算规划过程中,项目经理意识到可供创建估算的信息很少。项目经理应该使用什么来提高准确性? A.历史经验教训 B.三点估算 C.类比估算 D.专家判断 3.一座城市将召开一次运动赛事,需要基础设施开发。由于项目存在公共利益,政府要求项目团队每周提交绩效成本和进度更新/若要有效地跟踪进度,团队应考虑什么工具或技术? A.内部收益率(TRR) B.投资回报率(ROI) C.计划评审技术(PERT) D.挣值管理(EVM) 点击查看答案 1.解析:B是参考答案。估算成本是对完成项目工作所需资源成本进行近似估算的过程。本过程的主要作用是,确定项目所需的资金。知识点:章节7.2前言 2.解析:B是参考答案。通过考虑估算中的不确定性与风险,使用三种估算值来界定活动成本的近似区间,可以提高单点成本估算的准确性。知识点:章节6.5.2.2 3.解析

  • 《数据挖掘导论》读书笔记(三)—— 探索数据

    书名:数据挖掘导论(IntroductiontoDataMining) 作者:Pang-NingTan/MichaelSteinbach/VipinKumar 出版社:人民邮电出版社 译者:范明/范宏建 出版年:2010-12-10 ISBN:9787115241009 第3章探索数据 鸢尾花数据集 数据来源 加州大学欧文分校(UCI)机器学习库鸢尾花数据集 数据介绍 包含150种鸢尾花信息,每50种取自三个鸢尾花品种之一:Setosa、Versicolour、Virginica。 花的特征有以下五种: 萼片长度(厘米) 萼片宽度(厘米) 花瓣长度(厘米) 花瓣宽度(厘米) 类(Setosa、Versicolour、Virginica) 汇总统计 汇总统计(summarystatistics)是量化的(如均值和标准差),用单个数或数的小集合表示可能很大的值集的各种特征。 频率和众数 考虑m个对象,这m个对象具有属性x,x的取值集合为{v1,...,vi,...,vk}。 则vi对应的频率:frequency(vi)=具有属性vi的对象数/m 分类属性的众数(mode)是具

  • Google 插件

    目录前言使用方法(以85.0.4183.102(正式版本)(64位)为例)插件清单1.GitHub加速2.Google网上应用商店访问及谷歌搜索引擎使用(免翻)3.Tampermonkey(大量优秀脚本的爹)4.广告终结者5.Google翻译6.Imagus7.Listen18.右键搜9.SimpleAllowCopy(解除复制文本限制)10.(客串)分享一个好用的解压缩软件(Bandizip)11.中国大学/超星/智慧树等网课刷课(大学生福报,小白可入)写在结尾 前言 分享一些比较好用的Google插件,还有什么特别实用的也可以在评论区留下~ 你以为这会拖慢你的电脑?还在担心轻薄本经不起折腾?不不不,这将会让你的GoogleChrome无比丝滑 使用方法(以85.0.4183.102(正式版本)(64位)为例) 打开google浏览器的开发者选项(设置-拓展程序-开发者模式✔) .crx文件直接拖进去 文件夹格式的文件,先解压缩,再整个文件夹拖进去 插件清单 1.GitHub加速 感觉最近这个大型交友会所开启速度好像变快了[Doge]国内Github下载很慢,用上了

  • linux系统中离线安装python3.7过程记录

    最近公司新弄来一台linux redhat4.4.7服务器,准备在上面离线安装python3.7,安装过程中出现一些问题,特此记录下来。 首先在python官网上下载了 Python-3.7.3.tgz文件,放在/usr/local/python3.7路径下,然后解压到该路径下 tar-zxvfPython-3.7.3.tgz复制 接着进入/usr/local/python3.7/python-3.7.3路径,执行 ./configure --prefix=/usr/local/python3.7 完成之后,接着执行make&&makeinstall 指令进行安装,结果报如下错误 ModuleNotFoundError:Nomodulenamed'_ctypes' 网上查找一番,原因是安装pyhton3.7需要一个依赖模块libffi-devel,为此在官网上下载了libffi-devel-3.2.1-alt2.x86_64.rpm文件,执行一下命令进行安装   rpm-ivh libf

  • [USACO19DEC]Tree Depth P 题解

    一个点的深度等于树中它祖先的个数(包括自己)。 那么我们可以对于一个点对\((x,y)\)考虑在所有排列中\(y\)做了几次\(x\)的祖先。 在笛卡尔树上如果\(y\)是\(x\)的祖先那么\(a_y\)是\(a_{x..y}\)中的最小值。(这里现设\(x\ley\)) 那么我们可以求:有多少个逆序对个数为\(K\)的排列,满足\(a_y\)是\(a_{x..y}\)中的最小值(\(x\ley\))。 前置1:有多少个逆序对个数为\(K\)的\(n\)元排列。 先放结论:答案是\(\prod\limits_{i=1}^{n}\sum\limits_{j=0}^{i-1}t^i\)的\(t^K\)次项系数,这里用到了生成函数知识。 证明1: 我们考虑相对大小。从左到右安排每一个位置,在考虑第\(i\)个数时,它前面有\(i-1\)个数,它可以成为第\(1\text{~}i\)小的任意一个数,增加的逆序对个数为\(0\text{~}i-1\)。最小时新增逆序对为\(i-1\);第\(i\)小时,它就是最大的数,新增的逆序对数为0。 从右到左安排也是可以的,只不过考虑它可以成为第\(1

  • 高精度NTC测温的硬件电路以及软件设计

    什么是NTC NTC是热敏电阻,其电阻值对温度变化敏感,在不同的温度下,可以呈现不同的电阻值。 热敏电阻有两类,一类是负温度系数电阻(NTC),温度增加时,电阻值降低,另一类是正温度系数电阻(PTC),温度增加时,电阻值增加。 热敏电阻的电阻值计算 NTC的电阻值R与温度的关系可以近似表示为: 公式1,电阻与温度函数关系式 其中T是绝对温度,数值为摄氏温度+273.15,单位为K(开尔文)。 R0一般取温度25℃即298.15K时的电阻值,对应的T0取25℃,即298.15K。 B为材料常数.不同的村料或者生产工艺都能导致B的数值发生变化,甚至在热敏电阻的工作范围内,B的数值都可能发生变化,而不是严格的常数; 因为NTC的电阻与温度呈非线性的关系,而且存着温度的增加,温度随着温度变化的变化率越小。 所以随着温度的增加,NTC测温的精度变化; 所以比较适合于温度变化范围小的使用场景,比如环境温度(约为-20℃-50℃)或者是水温的检测(0℃-100℃)。 下图是在淘宝上搜索到的一款NTC,按照温度为25℃的电阻取值,可有5KΩ,10KΩ等不同的规格,而材料系数B值固定为3950。

  • 周志华《机器学习》第二章学习笔记

    一、误差、经验误差(训练误差)、泛化误差->过拟合(overfitting)、欠拟合(underfitting) 1.误差(error)是学习器的实际预测输出与样本的真实输出之间的差异。 2.训练误差(trainingerror)或经验误差(empiricalerror)是训练集上的误差。 3.泛化误差(generalizationerror)是新样本上的误差。 4.显然,我们希望得到在新样本上的泛化误差比较小的学习器。当事先不知道新样本是什么样,实际能做的就是让泛化误差最小化。 为了达到这个目的,应该从训练样本中尽可能学出适用于所有潜在样本的“普遍规律”,这样才能在遇到新样本的时候做出正确的判别。然而,把训练样本学得太好的时候,很可能已经把训练样本自身的一些特点当作了所有潜在样本会具有的一般性质,这样就会导致泛化性能下降,这种现象称为“过拟合(overfitting)”,和其相对的是欠拟合(underfitting)。前者是学习能力太过于强大,后者是学习能力低下。 5.如何解决过拟合(overfitting)和欠拟合(underfitting)问题 解决欠拟合(underfit

  • 1338. Reduce Array Size to The Half

    Givenanarray arr. Youcanchooseasetofintegersandremovealltheoccurrencesoftheseintegersinthearray. Return theminimumsizeoftheset sothat atleast halfoftheintegersofthearrayareremoved. 给一个数组,最少去掉多少个相同的数字,可以使得数组长度小于等于原始长度的一半。 先统计每个元素出现的次数count,然后再维护一个key是出现次数f,value是出现次数的次数。比如[2,2,3,3,4]->count[0,2,2,1]->f[1,2,0,0] 然后对于f,index从大到小去遍历,长度减小index步,直到长度小于等于一半。 classSolution(object): defminSetSize(self,arr): """ :typearr:List[int] :rtype:int """ count={} forvalueinarr:

  • [小记]命令行中将内容导出到文本

    C:\Users\Administrator>ipconfig-all>"D:\ipconfig_all.txt" 这个命令把ipconfig-all的内容导出到"D:\ipconfig_all.txt"的文件(要加引号)。  

相关推荐

推荐阅读