Java 基本知识点概要1. 了解Java语言的特征,掌握JDK(Java开发工具包)的安装、目录层次、环境变量配置,Java程序的实现过程 a).J2SE 1.6( JDK1.5)的安装:(推荐路径) Jdk路径: C:\Soft\JDK1.6 Jre路径: C:\program files\Java\jre1.6.0\。
b).环境变量配置: 我的电脑--〉右击属性--〉高级--〉环境变量--〉新建 变量名 变量值Java_Home C:\Soft\JDK1.6Path %Java_Home%\binClassPath %Java_Home%\jre\lib\rt.jar;.c).编写Java源文件(Xxx.java)==>编译成字节码 (javac Xxx.java) ==>执行字节码文件 java Xxx 2.Java语言基础 a). 数据类型: 8种基本类型:byte,char,short,int,long,float,double,boolean 引用类型: 数组, 类,接口 b).结构化语句: if,if--else ,if--else if ,switch--case,while,do--while,for c).数组 int num[]={1,2,3,4,5}; <> int []num={1,2,3,4,5}; int num[]=new int[size]; int num[]=new int[]{1,2,3,4,5}; 3.面向对象的基础 a).类:具有相同属性和行为的一组对象的集合 b).对象:客观存在的或可被描述的抽象对象,具有特定属性和行为的实体。 c).类是对象的模板(原型),对象是类的具体实例 d).抽象、封装、继承,多态(重载,重写,接口多实现) e).构造方法(默认构造器/参数化构造器) f).限制访问修饰符: private,缺省(默认),protected,public g).附加修饰符:final,static,abstract h).接口 4.Java 基础包 a). java.lang : 包装类(Byte,Character,Short,Integer,Long,Float,Double,Boolean) 其它类:String,StringBuffer,Math,Class,Object b). java.util 随机类:Random 日期类:Date,Calender 集合框架体系:Collection,List,Set,ArrayList,LinkedList,Vector,HashMap c). java.io 文件类:File 字节流:FileInputStream,FileOutputStream 字符流:FileReader,FileWriter,BufferedReader,BufferedWriter 二进制流:(了解) DataInputStream,DataOutputStream 构造键盘流:BufferedReader input=new BufferedReader(new InputStreamReader(System.in)); d). java.swt /javax.swing 容器类组件:JFrame,JPanel,JScrollPane 组件: JLabel,JTextField,JPasswordField,JTextArea,JComboBox, JRadioButton,JCheckBox,JMenuBar,JMenu,JMenuItem 5.JDBC 数据库连接 数据库的连接步骤: 1). 加载数据库驱动类: Class.forName(driver) 2). 通过驱动程序管理器获取连接: DriverManager.getConnection(url,user,password) 3). 基于连接对象建立处理器对象/预处理器对象 Statement stmt=conn.createStatement(); PreparedStatement stmt=conn.prepareStatement("insert into student values(?,?,?,?,?)"); 4). 处理器执行SQL命令(Select/Insert/Update/Delete)executeQuery(Select) ==>返回查询的结果集(ResultSet, ResultSet.getXXX(列编号,从1开始)) executeUpdate(Insert/Update/Delete) ==>返回执行命令影响的记录行(int) 5). 关闭各个对象 导入java.sql包 一、加载要连接数据库的驱动程序 Class.forName(driver) 注:Class.forName()方法将给定的类加载到JVM,如果系统中不存在给定的类, 则会引发异常 二、通过驱动程序管理器得到连接实例 Connection conn=DriverManager.getConnection(url,user,pwd); 注1:DriverManager类跟踪已注册的驱动程序,通过getConnection(URL)方法, 找到一个能够连接至URL中指定的数据库驱动程序,它接收三个参数, 分别表示: 数据源的名称(类型) 、用户名(可选)、密码(可选) 注2: 1). localhost 表示本机,也可以用127.0.0.1 如果你连的不是本机,可能通过 机器名 或 IP(192.111.113.100) 来连接 2). 1433是端口号,SQL server默认是1433 , 自己可以手工的改动它 3). databasename后面跟你的数据库的名称,表示你要连接的数据库是哪个 4). 最后是用户名及密码, 当前可以访问该数据库的用户及密码 注3:基于不同连接方式和不同类型的数据源连接字符串如下: 1. Jdbc-Odbc桥 (SQLServer/Microsoft Access )数据库 1.1 加载驱动程序: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 1.2 建立数据源(控制面板中配置数据源,MyDataSource是数据源名称) conn=DriverManager.getConnection("jdbc:odbc:MyDataSource"); 2. 直连SQLServer 驱动程序: -- SQLServer 2000: 2.1 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); 2.2 conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;dataBaseName=DBName","sa",""); -- SQLServer 2005: 3.1 Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 3.2 conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433; dataBaseName=DBName","sa",""); -- 直连Access 驱动程序: 4.1 加载驱动程序: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 4.2、不建立数据源 ,直接写连接字符串 conn=DriverManager.getConnection("jdbc:odbc:;Driver=Microsoft Access Driver (*.mdb);DBQ=Test.mdb"); 注: 1). DBQ后面指定的是要连接的Access 数据库 2). Microsoft Access driver (*.mdb) 中。
-A- AJAX: (建议不译,原因:专有名词) [Asynchronous JavaScript and XML,异步JavaScript及XML] annotation: 注解 Ant: (建议不译,原因:专有名词) AOP: (建议不译,原因:专有名词) [aspect-oriented programming, 面向层面编程] application: 应用 argument: 参数 -B- B2B: (建议不译,原因:专有名词) [Business-to-Business, 业务对业务] BAM: (建议不译,原因:专有名词) [Business Activity Monitoring, 业务活动监测] BMP: (建议不译,原因:专有名词) [bean-managed persistence, Bean管理的持久化] BPEL: (建议不译,原因:专有名词) [Business Process Excution Language, 业务流程执行语言] BPM: (建议不译,原因:专有名词) [Business Process Modeling, 业务流程建模] build: 建立;编译 -C- C2B: (建议不译,原因:专有名词) [Consumer-to-Business, 客户对业务] CAD: (建议不译,原因:专有名词) [Computer Aided Design, 计算机辅助设计] CAM: (建议不译,原因:专有名词) [Computer Aided Modeling, 计算机辅助建模] case-insensitive: 大小写不敏感 case-sensitive: 大小写敏感 container: 容器 cluster: 集群 CMP: (建议不译,原因:专有名词) [container-managed persistence, 容器管理的持久化] component: 组件,部件 configuration: 配置 context: 上下文,环境 control: 控件 convention: 约定 CORBA: (建议不译,原因:专有名词) [Common Object Request Broker Architecture,公共对象请求代理体系] COS: (建议不译,原因:专有名词) [Common Object Services,公共对象服务] couple: 耦合 CRUD: 专指数据库操作create, read, update, delete,可以不译 -D- Daemon: (建议不译,原因:专有名词) [Internet中用于邮件收发的后台程序] DAO: (建议不译,原因:专有名词) [Data Access Object, 数据访问对象] data: 数据 DBMS: (建议不译,原因:专有名词) [Database Management System, 数据库管理系统] DDL: (建议不译,原因:专有名词) [Data Definition Language, 数据定义语言] Declarative Programming: 声明式编程 delegate: 委托 Dependency Injection: 依赖注入 deploy: 部署 deserialize: 反序列化(也可译为反串行化),即取出 dialect: (行业)术语 directive: 指令 DIT: (建议不译,原因:专有名词) [Directory Information Tree, 目录信息树] DML: (建议不译,原因:专有名词) [Data Manipulation Language, 数据操作语言] DNS: (建议不译,原因:专有名词) [Internet Domain Name System, 因特网域名系统] domain: 域 DSL: (建议不译,原因:专有名词) [Domain-Specific Languages, 特定领域语言] DTOs: (建议不译,原因:专有名词) [data transfer objects, 数据传输对象] -E- EAI: (建议不译,原因:专有名词) [Enterprise Application Integration: 企业应用集成] ECC: (建议不译,原因:专有名词) [error correcting codes: 错误纠正代码] EIS: (建议不译,原因:专有名词) [Enterprise Information System: 企业信息系统] EJB: (建议不译,原因:专有名词) [Enterprise JavaBean, 企业JavaBean] encapsulate: 封装 ESB: (建议不译,原因:专有名词) [Enterprise Service Bus, 企业服务总线] event: 事件 -F- FAQs: (建议不译,原因:专有名词) [Frequently Asked Questions, 经常提问的问题] FIFO: 先进先出 [First in, First out] fire: 触发 firewall: 防火墙 framework: 框架 function: 函数 -G- GoF: "四人帮",对名著Design Patterns-Elements of Reusable Object-Oriented Software的四名作者的"戏"称。
[Gang of Four] granularity: 颗粒性,颗粒度 GUI: (建议不译,原因:专有名词) [Graphic User Interface: 图形用户接口] GUID: (建议不译,原因:专有名词) [Globally Unique Identifier: 全球唯一标识符] -H- hard-coding: 硬碥码 Hibernate: (建议不译,原因:专有名词) [一种为应用程序提供持久化服务的框架] -I- IDE: 集成开发环境 [Integrated Development Environment] implement: 实现 internet: 因特网 (也可以不译,原因:在中文环境下已经得到充分理解及认同) intranet: 企业内部网 IoC: (建议不译,原因:专有名词) [Inversion of Control, 控制反转] -J- JavaBean: (建议不译,原因:专有名词) JCP: (建议不译,原因:专有名词) [Java Community Process, Java社区研究] JDBC: (建议不译,原因:专有名词) [Java DataBase Connectivity, Java数据库连接] JDO: (建议不译,原因:专有名词) [Java Data Objects, Java数据对象] JES: Java企业系统 [Java Enterprise System] JOnAS: (建议不译,原因:专有名词) [ Java Open Application Server, Java开放应用服务器] JNDI: (建议不译,原因:专有名词) [Java Naming and Directory Interface, Java命名与目录接口] JTA: (建议不译,原因:专有名词) [Java Transaction API: Java事务API] JVM: (建议不译,原。
第2章 一切都是对象2.1 用句柄操纵对象2.2 必须创建所有对象2.2.1 保存在什么地方2.2.2 特殊情况:主类型2.2.3 Java中的数组2.3 绝对不要清除对象2.3.1 作用域2.3.2 对象的作用域2.4 新建数据类型:类2.4.1 字段和方法2.5 方法、自变量和返回值2.5.1 自变量列表2.6 构建Java程序2.6.1 名字的可见性2.6.2 使用其他组件2.6.3 static关键字2.7 我们的第一个Java程序2.8 注释和嵌入文档2.8.1 注释文档2.8.2 具体语法2.8.3 嵌入HTML2.8.4 @see:引用其他类2.8.5 类文档标记2.8.6 变量文档标记2.8.7 方法文档标记2.8.8 文档示例2.9 编码样式2.10 总结2.11 练习 第3章 控制程序流程3.1 使用Java运算符3.1.1 优先级3.1.2 赋值3.1.3 算术运算符3.1.4 自动递增和递减3.1.5 关系运算符3.1.6 逻辑运算符3.1.7 按位运算符3.1.8 移位运算符3.1.9 三元if-else运算符3.1.10 逗号运算符3.1.11 字串运算符+3.1.12 运算符常规操作规则3.1.13 造型运算符3.1.14 Java没有“sizeof”3.1.15 复习计算顺序3.1.16 运算符总结3.2 执行控制3.2.1 真和假3.2.2 if-else3.2.3 反复3.2.4 do-while3.2.5 for3.2.6 中断和继续3.2.7 切换3.3 总结3.4 练习 第4章 初始化和清除4.1 由构建器保证初始化4.2 方法过载4.2.1 区分过载方法4.2.2 主类型的过载4.2.3 返回值过载4.2.4 默认构建器4.2.5 this关键字4.3 清除:收尾和垃圾收集4.3.1 finalize()用途何在4.3.2 必须执行清除4.4 成员初始化4.4.1 规定初始化4.4.2 构建器初始化4.5 数组初始化4.5.1 多维数组4.6 总结4.7 练习 第5章 隐藏实施过程5.1 包:库单元5.1.1 创建独一无二的包名5.1.2 自定义工具库5.1.3 利用导入改变行为5.1.4 包的停用5.2 Java访问指示符5.2.1 “友好的”5.2.2 public:接口访问5.2.3 private:不能接触5.2.4 protected:“友好的一种”5.3 接口与实现5.4 类访问5.5 总结5.6 练习 第6章 类再生6.1 合成的语法6.2 继承的语法6.2.1 初始化基础类6.3 合成与继承的结合6.3.1 确保正确的清除6.3.2 名字的隐藏6.4 到底选择合成还是继承6.5 protected6.6 递增开发6.7 上溯造型6.7.1 何谓“上溯造型”?6.8 final关键字6.8.1 final数据6.8.2 final方法6.8.3 final类6.8.4 final的注意事项6.9 初始化和类装载6.9.1 继承初始化6.10 总结6.11 练习 第7章 多形性7.1 上溯造型7.1.1 为什么要上溯造型7.2 深入理解7.2.1 方法调用的绑定7.2.2 产生正确的行为7.2.3 扩展性7.3 覆盖与过载7.4 抽象类和方法7.5 接口7.5.1 Java的“多重继承”7.5.2 通过继承扩展接口7.5.3 常数分组7.5.4 初始化接口中的字段7.6 内部类7.6.1 内部类和上溯造型7.6.2 方法和作用域中的内部类7.6.3 链接到外部类7.6.4 static内部类7.6.5 引用外部类对象7.6.6 从内部类继承7.6.7 内部类可以覆盖吗?7.6.8 内部类标识符7.6.9 为什么要用内部类:控制框架7.7 构建器和多形性7.7.1 构建器的调用顺序7.7.2 继承和finalize()7.7.3 构建器内部的多形性方法的行为7.8 通过继承进行设计7.8.1 纯继承与扩展7.8.2 下溯造型与运行期类型标识7.9 总结7.10 练习 第8章 对象的容纳8.1 数组8.1.1 数组和第一类对象8.1.2 数组的返回8.2 集合8.2.1 缺点:类型未知8.3 枚举器(反复器)8.4 集合的类型8.4.1 Vector8.4.2 BitSet8.4.3 Stack8.4.4 Hashtable8.4.5 再论枚举器8.5 排序8.6 通用集合库8.7 新集合8.7.1 使用Collections8.7.2 使用Lists8.7.3 使用Sets8.7.4 使用Maps8.7.5 决定实施方案8.7.6 未支持的操作8.7.7 排序和搜索8.7.8 实用工具8.8 总结8.9 练习 第9章 违例差错控制9.1 基本违例9.1.1 违例自变量9.2 违例的捕获9.2.1 try块9.2.2 违例控制器9.2.3 违例规范9.2.4 捕获所有违例9.2.5 重新“掷”出违例9.3 标准Java违例9.3.1 RuntimeException的特殊情况9.4 创建自己的违例9.5 违例的限制9.6 用finally清除9.6.1 用finally做什么9.6.2 缺点:丢失的违例9.7 构建器9.8 违例匹配9.8.1 违例准则9.9 总结9.10 练习 第10章 Java IO系统10.1 输入和输出10.1.1 InputStream的类型10.1.2 OutputStream的类型10.2 增添属性和有用的接口10.2.1 通过FilterInputStream从InputStream里读入数据10.2.2 通过FilterOutputStream向OutputStream里写入数据10.3 本身的缺陷:RandomAccessFile10.4 File类10.4.1 目录列表器10.4.2 检查与创建目录10.5 IO流的典型应用10.5.1 输入流10.5.2 输出流10.5.3 快捷文件处理10.5.4 从标准输入中读取数据10.5.5 管道数据流10.6 StreamTokenizer10.6.1 StringTokenizer10.7 Java 1.1的IO流10.7.1 数据的发起与接收10.7.2 修改数据流的行为10.7.3 未改变的类10.7.4 一个例子10.7.5 重定向标准IO10.8 压缩10.8.1 用GZIP进行简单压缩10.8.2 用Zip进行多文件保存10.8.3 Java归档(jar)实用程序10.9 对象串联10.9.1 寻找类10.9.2 序列化的控制10.9.3 利用“持久性”10.10 总结10.11 练习 第11章 运行期类型鉴定11.1 对RTTI的需要11.1.1 Class对象11.1.2 造型前的检查11.2 RTTI语法11.3 反射:运行期类信息11.3.1 一个类方法提取器11.4 总结11.5 练习 第12章 传递和返回对象12.1 传递句柄12.1.1 别名问题12.2 制作本地副本12.2.1 按值传递12.2.2 克隆对象12.2.3 使类具有克隆能力12.2.4 成功的克隆12.2.5 Object.clone()的效果12.2.6 克隆合成对象12.2.7 用Vector进行深层复制12.2.8 通过序。
试试这个怎么样 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; public class Test extends JFrame implements ActionListener {private JMenuBar menuBar; private JMenu menuFile; private JMenu menuHelp; private JLabel label; private JButton button; private JMenuItem menuClose; private JMenuItem menuAbout; private static final long serialVersionUID = 1L; public Test() { init(); setLayout(null); add(menuBar); add(label); add(button); setVisible(true); setLocation(900,100); setSize(250,500); setResizable(false); } private void init() { menuBar=new JMenuBar(); menuBar.setBounds(0,0,250,30); menuFile=new JMenu("文件"); menuHelp=new JMenu("帮助"); menuBar.add(menuFile); menuBar.add(menuHelp); label=new JLabel("单击帮助菜单或按钮,查看信息。
"); label.setBounds(10,350,250,30); button=new JButton("关于"); button.setBounds(50,250,70,30); menuClose=new JMenuItem("关闭"); menuFile.add(menuClose); menuAbout=new JMenuItem("关于"); menuHelp.add(menuAbout); button.addActionListener(this); menuAbout.addActionListener(this); menuClose.addActionListener(this); } public static void main(String[] args) { new Test(); } public void actionPerformed(ActionEvent e) { if(e.getSource()==button||e.getSource()==menuAbout) {new Test2();} if(e.getSource()==menuClose) {this.dispose(); } } } class Test2 extends JDialog { private JLabel label; private static final long serialVersionUID = 1L; public Test2() {init(); add(label); setSize(300,200); setLocation(500,200); setVisible(true); } private void init() { label=new JLabel(); label.setText("我爱java!"); } }。
HttpServletRequest request.getRemoteAddr()//获取远程IP地址 HttpServletResponse response.setContentType("text/html;charset=gbk")//设置发送方式和字符集 response.getWriter();//获取输出对象,构造PrintWriter对象 返回响应 利用: 1) PrintWriter out = response.getWriter // 用于返回文本数据给客户端 2) ServletOutputStream out = response.getOutputStream // 用于返回二进制数据给客户端 Servlet中从request获得参数的方法: String getParameter(String); 有此参数但无值返回""; 无此参数则返回:null String[] getParameterValues(String); Map getParameterMap(); Enumeration getParameterNames();获得的是参数的名字,需要用名字再去获得参数的值 1)请阐述什么是ServletContext? 一种servlet服务的上下文,每一个servlet实例都对应在一个web application中,都属于这个上下文, 即为这个servletContext. 在一个servlet服务中,通过getServletContext()方法,获得上下文;2) 如何在一个Servlet中调用另外一个Servlet;如何在两个Servlet之间传递数据 getServletContext().getRequestDispatcher("/xxxx/xxxx").forward(request,response); request.setAttribute("xxxx",xxxx);------>requeset.getAttribute("xxxx"); Servlet中的方法: init(ServletConfig);//初始化Servlet用 init中有异常则servlet直接被回收,无异常则继续调用service()方法 覆盖父类init(ServletConfig)可能会出错(因为父类函数会对config做保存处理,以便以后使用),可以调用super(config)解决 service(request,response); //具体会调用HttpServlet的doGet,doPost(程序员在具体的servlet程序中覆盖了)方法实现功能, destory();//销毁servlet实例的时候调用 Servlet生命周期: 装载,init(),service(),destory()Servlet中进行页面转发: getServletContext().getRequestDispatcher("/user/user_list.jsp").forward(request, response); 或者: response.sendRedirect(request.getContextPath() + "/find.do"); Request中getContextPath、getServletPath、getRequestURI、request.getRealPath的区别//转载假定你的web application 名称为news,你在浏览器中输入请求路径: ; charset=GBK"%>
java开发技术学习基本上有下边几个阶段的主要内容,大家可以参考一下:第一阶段:java基础本阶段除了JavaSE中要求大家必会的java基础知识外,重点加强了数据结构思想、集合源码分析、jdk9-11新特性的学习。
第二阶段:数据库本阶段主要学习MySQL数据库知识,通过层层递进,让大家掌握开发使用的数据是如何存储和处理的。并且逐步深入学习到索引和优化、锁机制、存储过程等。
第三阶段:web网页技术本阶段以项目案例为驱动,采用所学即所用的方式指导大家学习,在边学边练过程中,可深入掌握Web开发技术,具备与之匹配的实战能力。第四阶段:框架学习本阶段主要是学习市面上流行的框架技术来提升自己的开发能力,再辅以Linux命令以及Linux服务器的使用等内容让新手学到技术,让老手学到思想,让高手学到境界。
第五阶段:互联网高级技术主要讲解分布式管理系统、Keepalived+Nginx主备、微服务架构技术、消息中间件技术、MySQL调优、高并发技术、性能优化、内存和GC等。第六阶段:企业项目本阶段主要是通过让学员学习企业流行的项目,在动手实操的过程中加深前面知识的认识,并且增加学员企业项目开发经验。
1. PATH环境变量。
作用是指定命令搜索路径,在命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。我们需要把jdk安装目录下的bin目录增加到现有的PATH变量中,bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待,设置好PATH变量后,就可以在任何目录下执行javac/java等工具了。
CLASSPATH环境变量。作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM就是通过CLASSPATH来寻找类的。
我们需要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中,当然,当前目录“.”也必须加入到该变量中。2、public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int sum=0;//设定一个变量,求和的值 for(int i=1;i<=100;i++){ sum=sum+i; } System.out.println("1+2+3+。
.+100的和:"+sum); }}3、import java.util.Arrays;public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int str[]={1,3,9,5,4,8,2}; Arrays.sort(str); System.out.println("数组中最大数:"+str[str.length-1]); }}4、public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String str="abc.java.txt";//定义一个变量设置文件名称 System.out.println(str.substring(str.lastIndexOf(".")+1)); }}5、public class Student {private String name;//姓名private int age;//年龄private double score;//成绩public Student(String name,int age,double score){ this.name=name; this.age=age; this.score=score;}public String getName() { return name;}public void setName(String name) { this.name = name;}public int getAge() { return age;}public void setAge(int age) { this.age = age;}public double getScore() { return score;}public void setScore(double score) { this.score = score;}}6、我就不贴代码了。你自己创建借个对象。
然后把五个对象的成绩放在一个数组中,直接调用Arrays.sort(数组名) 这个方法排序输出就ok了。7、方法:可以使用文件流来读写。
楼主可根据文件的类型选择是字节流还是字符流来实现。如果楼主还需要,可以把代码写出来8、TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。
一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。
三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。TCP协议能为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错地发往网络上的其他计算机,对可靠性要求高的数据通信系统往往使用TCP协议传输数据。
面向非连接的UDP协议“面向非连接”就是在正式通信前不必与对方先建立连接,不管对方状态就直接发送。这与现在风行的手机短信非常相似:你在发短信的时候,只需要输入对方手机号就OK了。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。
比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。例如,在默认状态下,一次“ping”操作发送4个数据包(如图2所示)。
大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。
正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。
TCP协议和UDP协议各有所长、各有所短,适用于不同要求的通信环境。9、
用户名: | |
密码: |