1.JAVA程序应用与开发(java应用开发技术实例教程)
2.QT+ModbusTCP 基于QTcpSocket纯手搓modbustcp协议
3.一次 Netty 代码不健壮导致的源码大量 CLOSE_WAIT 连接原因分析
JAVA程序应用与开发(java应用开发技术实例教程)
简述Java应用程序的开发流程
Java应用程序的运行经过编写、编译、下载运行三个步骤。源码
第1步,下载编写程序。源码使用记事本或其他软件编写程序的下载收费软件源码源代码,将源代码保存为文件filename.java文件。源码
第2步,下载编译程序。源码在MS-DOS命令窗口,下载将当前目录转换到Java源程序所在的源码保存目录;输入“javacfilename.java”形式的命令进行程序编译。
第3步,下载执行程序。源码在同样的下载命令窗口中输入“javafilename”形式的命令执行程序。
完成了程序的源码开发,查看相应t目录,其中应该具有两个文件,分别是XXXX.java和XXXX.class。
如果是开发网页应用,开发流程大概是这样的:
搭建开发平台,一般使用的是j2ee
编写DAO层,建立数据库
编写业务层action
编写显示文件jsp、html
Java桌面端程序开发
Java对于服务器个人电脑和移动设备来说是一项伟大的技术由于需要java的跨平台的特性因此java在服务器和移动设备方面的应用是非常成功的但java在个人电脑应用方面的情况和在服务器及移动设备方面的应用有所不同但是这很快就会有所改变至少比你想象得要快在这篇文章中我会分析一下java在桌面环境中的应用将怎样得到提升然后具体说一下javaGUI(用户图形接口)的三个主要的工具:AWTSwing和SWT在下文中我将会开发一个完整的java桌面应用程序Java与桌面端现在流行的桌面平台要数WindowsMacandLinux了但它们不是十全十美的Windows主宰著桌面操作系统的市场其上有巨大的应用和开发群体但它昂贵且有许多安全漏洞Linux有着稳固的基础它是开源的软件比Windows更可靠Macs非常容易操作且不是黑客的目标但与Windows和Linux比起来Mac的硬件和软件可选的余地非常的有限公司和个人选择他们的操作系统基于许多因素花费少且安全性高是首选的因素这导致一些组织从Windows系统转而选择Linux对许多用户来说可用性及对原有应用程序的支持是非常重要的因素这意味着Windows将继续享有巨大的市场Mac有其自己忠诚的用户这使得苹果机仍然可以存活Linux在桌面的流行及Mac的成功创造了多样性这种多样性正是Java需要的这种多样性使得Java在桌面有举足轻重的地位跨平台的支持Java运行于所有相关的操作系统包括WindowsMac和Linux对于任何组织他想把现有的应用从一个操作系统移植到另一个操作系统而不用做太多的改动那么Java正是他们首选的桌面开发平台或许用微软的可视化工具很容易构建NET应用但是这将使你被绑定在了Windows平台上了很多人也许想立刻用Linux代替Windows从而避免由微软件操作系统的漏洞带来的问题用户不能容忍的问题之一是当从Windows移植到Linux带来的巨大的费用如果你的应用程序用Java构建你就没有了这些问题Java的图形用户界面看上去会跟你用的操作系统一样而并不需要做什么改动假如有一天又有一种桌面操作系统出现的话java是个安全的赌注因为它现在能够运行在Windows和Linux上那么可以推测它也可以运行在将来可能出现的操作系统上这些操作系统可能或迟或早地由微软或是开源社区或是其它的人开发出来丰富的特征最初Java只有非常有限的一些特征去构建图形用户界面思想就是用平台无关的Java应用程序接口打包不同的操作系统的本地图形用户界面称之为抽象的窗口工具仅有普通的部件如文件域文本区选择框单选按钮列表框和按钮被AWT支持图形和图像的特性支持非常有限也就是说只足够构建简单的applet程序认识到需要更高级的图形用户界面组件和图形能力Sun公司开发了SwingJavaDJavaD图像的输入/输出Java高级图像(JAI)和很多其它的这些中的一些窗体组件现在已经是Java标准版(JSE)里的一部分并且其它的一些扩展必须和你的应用程序打包在一起例如SwingJavaD图像的输入/输出都是Java的核心API随着Java开发工具包(JDK)和Java运行环境一起提供让我们不要忘了JEE平台如果你开发服务器端的应用程序并且需要丰富的图形用户界面那么你毫无疑问应该选择Java这允许你把服务器端的一些代码移到客户端反之亦然例如一个项目可能开始是基于WEB和图形界面在某些时候用户可能要求图形元素不能在HTML中实现如果你选择java做客户端应用那么你可以重用这些当初用来做服务器端的代码如果你用远程调用一些类会真正地实现服务器和客户端的共享通过页面服务器Java桌面应用也能够和其它的Java或非Java应用程序通信如CORBATCP/IP或是HTTPJava图形界面工具Java有三个主要的图形界面工具AWTSwing和SWTSwing是构建java图形界面标准的API(应用程序接口)一些AWT类由Swing基础而来SWT是一个非常有前途的新的窗体工具由IBM资助但是事实上这三者相互补充他们满足不同的需求AWT抽象窗口工具集为简单的applet程序设计它不适宜用来构建丰富的桌面图形界面但是从开始被介绍它至少有一个好的思想就是布局管理它负责为组件找到一个放置的位置这种机制是必需的因为GUI组件在不同的操作系统中有不同的尺寸现在AWT扩展了组件模型和事件处理机制(由JavaBeans说明定义)新的图形API(称为JavaD)支持剪贴板和拖拉操作打印准入和新的GUI工具Swing所有这些都归到Java基础类中(JFC)SwingSwing是曾经开发的最复杂的GUI之一它有一套完全的组件从按钮到文件域到表格树型和文件编辑器这些组件不依赖于操作系统本地的部件而是用原始的图形像直线矩形文字画出这种画代表感观插件它能够模仿本地的感观Swing也有平台无关的外观称为MetalSwing的结构由MVC模式得到启发这里在屏幕上的视觉GUI组件和支持数据的模型对象之间有一个明显的分隔在GUI和数据层之间的通讯基于事件在最初的Swing版本中有许多错误并且有执行问题这减慢了接受它的速度Swing最大的问题是被从事于并且许多人相信它是为开发桌面应用而准备的今天有许多基于Swing开发的商业产品包括大多数的Java集成开发工具我所喜欢的集成开发工具是Jbuilder它的速度相当的快SWTSWT是IBM为它的Eclipse集成开发环境而开发的图形用户界面工具SWT可以在Eclipse环境外使用而且提供对操作系统本地图形用户界面的直接访问因此基于SWT的Java应用程序拥有本地的图形用户界面并且可以和本地别的应用程序和部件集成在一起假如你的桌面应用程序产生HTML报表你想把它显示给用户看你可以使用Swing去浏览简单的HTML文档但这不是一个理想的的解决方案最好是在你的应用程序里提供IE或者Mozilla浏览器引擎SWT社区现在正在设计浏览器API这些API可以让你产生基于IE或者Mozilla的HTML窗口SWT现在可以在AIXHPUXLinuxQNXSolarisandWindows下面运行MacOSXis也在进行之中误解与Bug对于java/Swing一直有着误解诸如Java/Swing太慢了或者是Java/Swing需要更多的内存Swing也许在老式的奔腾的cpu而且只有m内存运行JDK运行起来却是很慢但是如果在PIII级别的CPU有着mb的内存运行JDK环境是足够快的对于一个应用程序来说鼠标在毫秒和在毫秒的反映的区别对于使用者来说看起来是没什么区别的Java在企业级的数百人上千人同时在线的服务器表现的很好Java在对于有限资源的移动设备上的表现也是很出色的那为什么Java不能成为很好的桌面应用程序呢?以我的观点看Swing的bug比其运行速度慢这问题还严重例如如果你用的是JDK你将不能在表格(称为JTable)中输入%($#!q等这些字符这八个字符和箭头键及HomeEndPgupandPgdn这几个键的键值是相同的其中一个由JTable由到的类调用了KeyEventgetCharCode()方法代替KeyEventgetKeyCode()这个bug这JDK已经得到了纠正你大概已经放弃过Swing如果你是从用JDK的Swing你可能因为你不能在表格里输入q而恼怒可能不幸的是你正需要用Jtable开发一个Swing应用你将花费许多时间从sun的bug数据库中查找解决的办法但没有发现你需要的(记住在那时Swing还是个新事物)你将花费更多的时间去看Swing的源代码和发展中的工作区经过了这个的经历之后很少有人很在另一个项目里再用Swing了你的工作区会像下面这样子importjavaawt*;importjavaawtevent*;importjavaxswing*;importjavaxswingtable*;publicclassWorkingTableextendsJTable{ publicstaticfinalbooleanJDK=SystemgetProperty(javaversion)startsWith();publicvoidprocessKeyEvent(KeyEvente){ if(JDK){ charch=egetKeyChar();if(egetID()==KeyEventKEY_TYPED((=chch=)||ch=='q')){ intanchorRow=getSelectionModel().getAnchorSelectionIndex();intanchorColumn=getColumnModel().getSelectionModel().getAnchorSelectionIndex();if(anchorRow!=-1anchorColumn!=-1){ if(!isEditing())editCellAt(anchorRow,anchorColumn);ComponenteditorComp=getEditorComponent();if(isEditing()editorCompinstanceofJTextField){ JTextFieldtextField=(JTextField)editorComp;textField.setText(textField.getText()+ch);return;}}}}super.processKeyEvent(e);}}不幸的是,Swing有许多像上面描述的那样的问题,一些问题很难解决,需要做大量的工作。Tw.WInGwiT.例如,Swing的laravel cms源码打开文件和保存文件的对话框是基于称为JfileChooser的组件,它部分的执行了JDK1.2和JDK1.3(一些特性总是不能用的,要创建一个新的目录对大多数用户来是一个挑战)。我不知道为什么Sun需要几年的时间直到jdk1.4中才完成JfileChooser。在JDK1.4之前,你有两种选择:用这种破烂的JfileChooser或是创建你自己的文件选择框,Borland公司在他们的JBuilder4中做一个很好的文件打开对话框。然而,大多数的开发者用的是标准的JfileChooser,给他们的用户带来许多问题。有一件重要的事情需要注意:可以像上面描述的那个去创建工作环境,因为Swing的源代码是可以得到的。学习java源代码也能够让你成为更好的程序员并且让你理解工作在JavaAPI的内部机制。当你开发你自己习惯的GUI组件,这点是有用lishixinzhi/Article/program/Java/hx//
学java最重要的是学java的什么内容学java最重要的是下面四个内容:1、掌握Java语言的使用:语言语法、程序逻辑,OOP(面向对象)思想,封装、继承、多态,集合框架、泛型、FileI\O技术,多线程技术、socket网络编程,XML技术。编程有关的nfs源码安装操作系统基本使用,HTML5规范、HTML5文档结构、HTML5元素、Web语义化;CSS3规范、CSS3选择器、层叠与继承、盒模型与视觉格式化模型、现代CSS布局、CSS3基本属性千锋教育就有线上免费Java线上公开课。2、掌握JavaWeb开发技术:Java开发中使用到的Web前端技术,HTML5+CSS3,JavaScript操作BOM和DOM,JQuery的选择器、事件处理、动画效果,MySQL数据库技术,JDBC技术、JSP、Servlet、EL和JSTL、过滤器和监听器、AJax异步请求等,Linux技术、SVN、Linux环境下项目发布部署等。3、java ibatis源码掌握使用流行框架SSM\SSH技术实现企业级项目开发:重点学习MyBatis、Spring、SpringMVC框架的应用,Git、Java设计模式等,重点学习Struts2、Spring、Hibernate框架的应用,Maven、Oracle数据库应用技术,了解大数据生态体系,Hadoop基础入门。4、JavaWeb框架:Spring体系结构、SpringIOC、AOP、FactoryBean与BeanFactory、声明性事务处理、Spring5新特性。Maven与Gradle的使用。SpringBoot自动配置、SpringBootCLI与Initializr、SpringBootStarter、Actuator。SpringMVC工作原理和工作流程;拦截器、数据绑定转换和格式化、全局异常处理、postgresql源码调试转发与重定向、AJAX请求处理。如果想了解更多相关知识,建议到千锋教育了解一下。千锋教育总部位于北京,已在个城市成立分公司,现有教研讲师团队余人,每年培养泛IT人才近2万人,十年间累计培养超余万泛IT人才。
开发JAVA应用程序有哪些步骤?需要以下步骤:
定义问题:主要是指“想开发什么样的程序”、“这个程序用来解决什么问题”。满足目标客户的要求是最重要的。
2.是否具有可行性:要对这个程序是否具有实用性、利益性、以及对技术和法律方面的要求,都进行考虑。
3.需求分析。弄清用户对软件系统的全部需求,编写需求规格说明书和初步的用户手册,提交评审。
4.开发阶段:设计、实现、测试,是开发时最为重要的三个步骤。这三个步骤需要把程序员自己的理解及想法,和客户的需求都要得到体现。
5.对程序的维护:维护相当于售后服务,这个非常重要。因为程序在运营时,可能遇到各种各样的突发事件,面对这些突发情况,必须要进行紧急的处理。维护包括四个方面"改正性维护、适应性维护、完善性维护、预防性维护"。
Java,是由SunMicrosystems公司于年5月推出的Java程序设计语言和Java平台的总称。用Java实现的HotJava浏览器(支持Javaapplet)显示了Java的魅力:跨平台、动态的Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现均支持Javaapplet。
ava分为三个体系JavaSE(Java2PlatformStandardEdition,java平台标准版),JavaEE(Java2Platform,EnterpriseEdition,java平台企业版),JavaME(Java2PlatformMicroEdition,java平台微型版)。
QT+ModbusTCP 基于QTcpSocket纯手搓modbustcp协议
一、编写缘由
1.发现问题
近期项目需将modbus RTU转换为TCP形式,于是对原有modbus通讯线程进行重构。起初使用Qt自带的QModbusTcpClient类,顺利重构线程并读取数据,但在发送写数据请求时,TCP连接会断开。经过多次尝试,排除从站问题,即便直接连接modbusslave也存在同样问题。
2.查找问题
为解决问题,自行编写了一个tcp server,抓取QModbusTcpClient写数据的报文,与modbuspoll上的对比,发现QT中的报文比modbuspoll上的多出一部分,推测是协议错误。
3.解决策略
既然QModbusTcpClient的协议存在问题,决定不使用它。因此,直接利用QTcpSocket手动编写一个ModbusTcp类。
二、代码编写
1.协议解析
通过对比modbuspoll上的通信日志和网络上的modbustcp协议分析文章,研究出协议的标准格式。
2.封装函数
共封装了4个函数,分别是写单个线圈、写多个线圈、写单个保持寄存器、写多个保持寄存器。具体实现如下:
四个函数中,除了写多个线圈存在问题外,其他均已验证,可正确写入。
最后,将TCP作为一个子线程,线程初始化函数如下:
三、源码下载
模块下载
四、最后的最后再吐槽一下QModbusTcpClient真的很糟糕,根本无法使用。另外,网上的QtModbusTCP资源都无法使用,只有和我一样纯手搓才能解决问题。
一次 Netty 代码不健壮导致的大量 CLOSE_WAIT 连接原因分析
我们线上存在一个 Dubbo 服务,遇到大量 CLOSE_WAIT 状态的连接,始终无法消失,因此进行了原因分析。 CLOSE_WAIT 状态出现在被动关闭方,收到对端 FIN 包后回复 ACK,但未发送 FIN 包之前。问题在于服务没有回复 FIN,原因可能是收到了 FIN 包却未发送响应,通过抓包验证了这一情况。 问题核心在于为什么没有回复 FIN。Dubbo 服务底层使用 Netty,作为普通的 TCP 服务端,关键在于 FIN 包的回复。 分析显示,如果服务没有发送 FIN 包,可能原因有: 1. 半连接队列或全连接队列积压,通过 ss 命令查看全连接队列大小和等待 accept 的连接个数。 2. LISTEN 状态的 socket,Recv-Q 表示等待用户进程 accept 的连接个数,Send-Q 表示全连接队列最大容纳的连接数。 非 LISTEN 状态的 socket,Recv-Q 表示 receive queue 字节大小,Send-Q 表示 send queue 字节大小。 通过 ss 命令确认 Recv-Q 为 0,全连接队列无积压。 嫌疑指向 Netty 没有注册事件,导致收到 FIN 包后无动于衷。 进一步发现,凌晨 1 点业务实例加载大量数据导致堆内存占满,持续进行 fullgc。Netty 线程出现 OOM 异常。在 org.jboss.netty.channel.socket.nio.NioServerBoss#process 方法中,Netty 调用 accept 取走连接,第 行尝试注册事件时抛出 java.lang.OutOfMemoryError 异常。 因此,Netty 处理不健壮,try-catch 包裹了 accept 连接和注册事件逻辑,在 OOM 异常处理时,未能成功注册事件或关闭连接,导致连接存在但不被监听处理。 推荐相关视频学习:LinuxC++零拷贝的实现 用户态协议栈 ntytcp
支撑互联网的基石 TCP/IP,5个方面全面解析
TCP/IP协议栈深度解析丨实现单机百万连接丨优化三次握手、四次挥手
LinuxC++后台服务器开发架构师免费学习地址
为模拟问题复现,可使用字节码注入或直接重构 Netty 源码。本地拥有 Netty 源码,采用重构方法更快。重新构建项目后,使用 nc 模拟健康检查握手并断开连接,CLOSE_WAIT 状态连接持续存在直至 Netty 进程退出。再次 nc 断开连接,新增 CLOSE_WAIT 状态。由于服务持续进行健康检查,导致 OOM 期间 CLOSE_WAIT 状态不断增加。 问题核心:Netty 代码不够健壮,尝试捕获异常时,未能正确处理连接注册事件或关闭连接,导致连接存在且未被监听。 修改方式:在 catch 处理 throwable 时关闭连接即可,最新版本的 Netty 代码这部分逻辑已优化,将 accept 和注册事件拆分。有兴趣的读者可以尝试。 学习 TCP、网络编程是解决类似问题的关键。