




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
二 问答题1. 基于Socket的通信的原理是什么?答:Socket通信的原理还是比较简单的,它大致分为以下几个步骤。 服务器端的步骤如下。(1)建立服务器端的Socket,开始侦听整个网络中的连接请求。(2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。(3)当完成通信后,服务器关闭与客户端的Socket连接。客户端的步骤如下。(1)建立客户端的Socket,确定要连接的服务器的主机名和端口。(2)发送连接请求到服务器,并等待服务器的回馈信息。(3)连接成功后,与服务器进行数据的交互。(4)数据处理完毕后,关闭自身的Socket连接。2 如何实现多个客户端的Socket的通信3种方式: 1.不断循环accept()方法 2.多线程 3.线程池。3. Socket通讯的阻塞会发生在什么地方?客户端可能发生阻塞的地方:1 请求与服务器建立连接时,会进入阻塞状态,直到连接成功。2 线程从Socket的输入流读入数据时,如果没有足够的数据,就会进入阻塞状态,直到读到了足够的数据,或者到达输入流的末尾,或者出现了异常,才从输入流的read()方法返回或异常中断。3 线程向Socket的输出流写一批数据时,可能会进入阻塞状态,等到输出了所有的数据,或者出现异常,才从输出流的write()方法返回或异常中断。4 当调用Socket的setSoLinger()方法设置了关闭Socket的延迟时间,那么当线程执行Socket的close()方法时,会进入阻塞状态,直到底层Socket发送完所有剩余数据,或者超过了setSoLinger()方法设置的延迟时间,才从close()方法返回。服务器端可能发生阻塞的地方:1 线程执行ServerSocket的accept()方法,等待客户的连接,直到接收到了客户连接,才从accept()方法返回。2 线程从Socket的输入流读入数据时, 如果输入流没有足够的数据,就会进入阻塞状态。3 线程向Socket的输出流写一批数据时,可能会进入阻塞状态,等到输出了所有的数据,或者出现异常,才从输出流的write()方法返回或异常中断。4. java的TCP和UDP如何实现,各有什么优缺点。1,Java编写UDP网络程序1.1,DatagramSocketDatagramSocket有如下构造方法:1,DatagramSocket() :构造数据报套接字并将其绑定到本地主机上任何可用的端口。 2,DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。 3,DatagramSocket(int port, InetAddress laddr):创建数据报套接字,将其绑定到指定的本地地址。即指定网卡发送和接收数据.如果在创建DatagramSocket对象时,没有指定网卡的IP 地址,在发送数据时,底层驱动程序会自动选择一块网卡去发送,在接收数据时,会接收所有的网卡收到的与端口一致的数据.发送信息时,可以不指定端口号,接收信息时,要指定端口号,因为要接收指定的数据.发送数据使用DatagramSocket.send(DatagramPacket p)方法,接收数据使用DatagramSocket.receive(DatagramPacket p)方法.1.2,DatagramPacketDatagramPacket类有如下构造方法:1,DatagramPacket(byte buf, int length):构造 DatagramPacket,用来接收长度为length的数据包。2,DatagramPacket(byte buf, int length, InetAddress address, int port):构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号。接收数据时使用第一次构造方法,发送数据时使用第二种构造方法.1.3,InetAddressJava中对IP地址进行包装的类,DatagramPacket.getAddress()可以获取发送或接收方的IP地址.DatagramPacket.getPort()可以获取发送或接收方的端口.2,Java编写TCP网络程序2.1,ServerSocket编写TCP网络服务程序,首先要用到.ServerSocket类用以创建服务器Socket.它的常用构造方法有:1,ServerSocket(int port):创建绑定到特定端口的服务器套接字。 2,ServerSocket(int port, int backlog):利用指定的backlog(服务器忙时保持连接请求的等待客户数量),创建服务器套接字并将其绑定到指定的本地端口号。 3,ServerSocket(int port, int backlog, InetAddress bindAddr):使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。2.2,Socket客户端要与服务器建立连接,必须先创建一个Socket对象,它的常用构造方法有:1,Socket(String host, int port):创建一个流套接字并将其连接到指定主机上的指定端口号。2,Socket(InetAddress address, int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号。3,Socket(InetAddress address, int port, InetAddress localAddr, int localPort):创建一个套接字并将其连接到指定远程端口上的指定远程地址。4,Socket(String host, int port, InetAddress localAddr, int localPort):创建一个套接字并将其连接到指定远程主机上的指定远程端口。对于通常情况的应用,使用第1个构造方法来创建客户端的Socket对象,并与服务器建立连接,是非常简单和方便的.服务器端程序调用ServerSocket.accept方法等待客户端的连接请求,一旦accept接收了客户端连接请求,该方法返回一个与该客户端建立了专线连接的Socket对象,不用程序去创建这个Socket对象.建立了连接的两个Socket是以IO流的方式进行数据交换的,Java提供了Socket.getInputStream返回Socket的输入流对象,Socket.getOutputStream返回Socket的输出流对象.优缺点:可以答网络上学习的5无阻塞通信的原理是什么?阻塞通信和无阻塞通信的区别是什么?使用无限线循环策略采用阻塞模式,用线程池中的工作线程处理每个客户连接。采用非阻塞模式,单个线程同时负责接收多个客户连接,以及与多个客户交换数据的任务。由一个线程负责接收多个客户连接,采用阻塞模式;由另一个线程负责与多个客户交换数据,采用非阻塞模式。阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。6 NIO的主要优点是什么?速度相对较快,面向块,提供了buffer,来解决数据的传送和处理块读写,而非字节读写,读写速度快。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。NIO 的创建目的是为了让 Java 程序员可以实现高速 I/O 而无需编写自定义的本机代码。NIO 将最耗时的 I/O 操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度。 NIO 提供了Buffer ,Channel来解决数据的传送和处理中的问题。7 缓冲区所有的缓冲区都有以下属性:容量(capacity)极限(limit) 位置(position):表示什么,其大小关系是什么容量(capacity):表示该缓冲区可以保存多少数据。极限(limit):表示缓冲区的当前终点,不能对缓冲区中超过极限的区域进行读写操作。极限是可以修改的,这有利于缓冲区的重用。例如,假定容量为100的缓冲区已经填满了数据,接着程序在重用缓冲区时,仅仅将10个新的数据写入缓冲区中从位置0到10的区域,这时可以将极限设为10,这样就不能读取先前的数据了。极限是一个非负整数,不应该大于容量。位置(position):表示缓冲区中下一个读写单元的位置,每次读写缓冲区的数据时,都会改变该值,为下一次读写数据作准备。位置是一个非负整数,不应该大于极限。以上三个属性的关系为:容量=极限=位置=08 JDBC3.0有哪些新的特性?元数据 API,CallableStatements 中已命名的参数,数据类型的改变,检索自动产生的关键字,连接器关系,ResultSet 可保持性,返回多重结果,预备语句池,连接池。9 为什么产生Hibernate? Hibernate的ORM指的是什么?如何使一个对象持久化?1.hibernate是一种ORM(object relation mapping,对象关系映射)框架,所谓的对象关系映射,通俗的说,就是把JAVA对象保存到关系型数据库中,即进行持久化的框架。2.hibernate进行持久化首先要建立对象到关系数据库的映射。3.hibernate根据定义的映射规则将对象持久化(保存到)数据库存中。这就实现了对象持久化。使用session与sessionfactory对象,Session接口提供增、删、改、查功能。Session中有一个缓存,位于缓存中对象处于持久化状态,他和数据库中的记录相对应。Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();另一种回答:Hibernate是一种运用DAO(Data Access Object)设计模式来实现对象和关系数据库之间映射(O/R Mapping)的开源框架。它对JDBC进行了轻量级的对象封装,使得Java程序员可以完全使用面向对象的编程思维来操作关系数据库,是持久层的一项实现技术。相比于其它持久层实现技术如JDBC、EJB(Entity Beans)、JDO(Java Data Object)等,Hibernate易于掌握,更加符合编程人员的面向对象思维,Hibernate拥有自己的一种查询语言(HQL),它是完全面向对象的。Hibernate通过创建与数据库中的表对应的持久化对象,然后再通过影射文件将持久化对象中的属性与数据库表中的字段对应起来。为Java 程序员提供了面向对象的API和接口来操纵数据库,从而避免了在业务逻辑中嵌入大量的JDBC访问和事物控制代码。ORM(Object/Relation Mapping)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。10 Hibernate有哪些查询方式?OID检索HQL检索QBC检索本地SQL检索11 Hibernate工作原理及为什么要用ORM?对象与关系的桥梁 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory原因:1、繁琐的代码问题: 用JDBC的API编程访问数据库,代码量较大,特别是访问字段较多的表的时候,代码显得繁琐、累赘,容易出错, 2、数据库对象连接问题 关系数据对象之间,存在各种关系,包括1对1、1对多、多对1、多对多、级联等。在数据库对象更新的时候,如果采用JDBC编程,程序员必须十分小心处理这些关系,以保证维持这些关系不会出现错误,而这个过程是一个很痛苦的过程。 ORM建立Java对象与数据库对象关系影射的同时,也自动根据数据库对象之间的关系创建Java对象的关系,并且提供了维持这些关系完整、有效的机制。3、系统架构问题 现在的应用系统,一般由展示层、业务逻辑层、数据访问层、数据库层等组成,各层次功能划分非常清晰。JDBC属于数据访问层,但是使用JDBC编程时,程序员必须知道后台是用什么数据库、有哪些表、各个表有有哪些字段、各个字段的类型是什么、表与表之间什么关系、创建了什么索引等等与后台数据库相关的详细信息。相当于软件程序员兼职数据库DBA。 使用ORM技术,可以将数据库层完全隐蔽,呈献给程序员的只有Java的对象,程序员只需要根据业务逻辑的需要调用Java对象的Getter和Setter方法,即可实现对后台数据库的操作,程序员不必知道后台采用什么数据库、有哪些表、有什么字段、表与表之间有什么关系。 于是,系统设计人员把ORM搭建好后,把Java对象交给程序员去实现业务逻辑,使数据访问层与数据库层清晰分界。4、性能问题12 Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、13.Hibernate对象的三种状态是什么?(1)瞬态:表示该实体对象在内存中是自由存在的,也就是说与数据库中的数据没有任何的关联即,该实体从未与任何持久化上下文联系过,没有持久化标识(相当与主键)。瞬态实体的特征有: 与数据库中的记录没有任何关联,也就是没有与其相关联的数据库记录与Session没有任何关系,也就是没有通过Session对象的实例对其进行任何持久化的操作。(2)持久态:指该实体对象处于Hibernate框架所管理的状态,也就是说这个实体对象是与Session对象的实例相关的。处于持久态的实体对象的最大特征是对其所作的任何变更操作都将被Hibernate持久化到数据库中。处于持久态的对象具有的特征为: 每个持久态对象都于一个Session对象关联 处于持久态的对象是于数据库中的记录相关联的 Hibernate会根据持久态对象的属性的变化而改变数据库中的相应记录(3)游离态:处于持久态的实体对象,当他不再与Session对象关联时,这个对象就变成了游离态。游离态对象的特征有: 游离态对象一定是由持久态对象转换而来 游离态实体不再于Session关联 游离态实体对象与数据库中的数据没有直接联系,主要表现在对其进行的修改不再影响到数据库中的数据 游离态实体对象在数据库中有相应的数据记录(如果该记录没有被删除)14 动态代理是什么,如何实现类的动态代理动态代理是 java.lang.reflect 包的一部分,它允许程序创建代理对象,代理对象能实现一个或多个已知接口,并用反射代替内置的虚方法分派,编程地分派对接口方法的调用。;实现:public class SetProxyFactory public static Set getSetProxy(final Set s) return (Set) Proxy.newProxyInstance (s.getClass().getClassLoader(), new Class Set.class , new InvocationHandler() public Object invoke(Object proxy, Method method, Object args) throws Throwable return method.invoke(s, args); );15 Spring的IOC的主要目的?促进松耦合,面向接口编程。非侵入的以及类的注入。16 Spring的AOP的功能是什么?将一个共同的功能从不同的类中分离出来,然后将其封装使之可以被其他类使用。面向方面的编程,它是类的织入,即把日志记录,性能分析,安全性分析,持久化等等织入到业务逻辑中。17 Spring框架的优点都有什么?轻量从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。 Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类; 控制反转Spring通过一种称作控制反转(IoC)的技术促进了松耦合; 面向切面Spring提供了面向切面编程的丰富支持; 容器Spring包含并管理应用对象的配置和生命周期; 框架Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等)18 简述你对IoC(Inversion of Control)的理解一个类需要用到某个接口的方法,我们需要将类A和接口B的实现关联起来,最简单的方法是类A中创建一个对于接口B的实现C的实例,但这种方法显然两者的依赖(Dependency)太大了。而IoC的方法是只在类A中定义好用于关联接口B的实现的方法,将类A,接口B和接口B的实现C放入IoC的 容器(Container)中,通过一定的配置由容器(Container)来实现类A与接口B的实现C的关联。19 简述你对AOP(Aspect Oriented Programming)的理解AOP是OOP的补充,是GOF的延续。我们知道设计模式是对于面向对象设计中经验的总结,它孜孜不断追求的就是调用者与被调用者之间的解耦。有了设计模式我们可以更有效的利用面向对象的特性,使得整个软件设计更加灵活、优雅。但是设计模式是基于面向对象的思想而形成的,更多的时候关注的是对象层次的东西,在解决对象行为内部问题方面却有些不足。AOP的出现恰恰就是对面向对象思想做出了完美的补充。20 什么是分布式技术?JAVA实现分布式技术有什么优越性?一种基于网络的计算机处理技术,与集中式相对应。由于个人计算机的性能得到极大的提高及其使用的普及,使处理能力分布到网络上的所有计算机成为可能。分布式计算是和集中式计算相对立的概念,分布式计算的数据可以分布在很大区域,Java实现动态性的优越性,例如对类的动态加载,快速访问。跨平台 动态加载 数据的分布与操作的分布 逻辑与物理位置的不同 负载均衡21 什么是RMI?RMI的对象调用过程是什么?远程方法调用Java的RMI(Remote Method Invocation, 远程方法调用)允许运行在一个Java虚拟机上的对象调用动行在另一个Java虚拟机上的对象的方法。这两个Java虚拟机可以是运行在相同的机器上的不同进程里,也可以是通过TCP/IP连接的不同计算机上。rmi简单的说就可以使用远程对象的方法,通过给定的方法名字和方法的参数可以构建一个方法。RMI采用客户/服务器通信方式。在服务器上部署了提供各种服务的远程对象,客户端请求访问服务器上远程对象的方法。22 RMI实现的步骤是什么?1 创建 远端接口 ,需要继承java.rmi.remote interface 2 定义一个实现远端接口的类3 服务器端完成对远端对象的注册4 编译之后再用rmic生成Stub在jdk1.2以后,利用java的reflect机制,就不需要skeleton文件了。5启动rmiregister,任何目录都可以。 注意是rmiregistry.exe6 启动server:7 启动client:三 程序题1 Socket的单客户端实现。客户端:public class ChatClientSocket s = null;public ChatClient() throws Exceptions = new Socket(, 8888);public void send(String str) throws ExceptionDataOutputStream dos = new DataOutputStream(s.getOutputStream();dos.writeUTF(str);public void disconnect() throws Exceptions.close();public static void main(String args) throws ExceptionBufferedReader br = new BufferedReader (new InputStreamReader(System.in);ChatClient cc = new ChatClient();String str = br.readLine();while(str != null & str.length() != 0)cc.send(str);str = br.readLine();cc.disconnect();服务器端:import .*;import java.util.*;import java.io.*;public class ChatServerServerSocket server = null;Collection cClient = new ArrayList();public ChatServer(int port) throws Exceptionserver = new ServerSocket(port);public void startServer() throws Exceptionwhile(true)Socket s = server.accept();cClient.add( new ClientConn(s) );class ClientConn implements RunnableSocket s = null;public ClientConn(Socket s)this.s = s;(new Thread(this).start();public void run()try DataInputStream dis = new DataInputStream(s.getInputStream();String str = dis.readUTF();while(str != null & str.length() !=0)System.out.println(str);str = dis.readUTF();s.close();cClient.remove(this); catch (IOException e) System.out.println(client quit);try if(s != null)s.close();cClient.remove(this); catch (IOException ioe)ioe.printStackTrace();public static void main(String args) throws ExceptionChatServer cs = new ChatServer(8888);cs.startServer();2 Socket的多客户端实现客户端:import .*;import java.io.*;public class MultiUser extends Threadprivate Socket socket;private InetAddress addr;public MultiUser(InetAddress addr)this.addr=addr;public void run()trysocket = new Socket(addr,8000);BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream();PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),true); while(true) String msg = in.readline(); System.out.println(msg); out.println( client has receive.); if(msg.equals(end) break; socket.close(); catch(IOException ) finally public class Test public static void main(String args)throws IOException InetAddress addr = InetAddress.getByName(null); while(true) MultiUser mu = new MultiUser(addr); mu.start(); 服务器端:import .*;import java.io.*;public class MultiServer public static void main(String args) throws IOException ServerSocket serversocket = new ServerSocket(8000); try Socket socket = serversocket.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(serversocket.getInputStream(); PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(serversocket.getOutputStream(),true); while(true) String msg = in.readLine(); if(msg.equals(end) break; System.out.println(Server recevice.+ msg); out.println(msg); serversocket.close(); catch(IOException e) System.err.println(IO Exception); finally 3 线程池的使用 /*获得连接 pool代表连接池*/public Connection getConnection() throws SQLException synchronized (pool) if ( !pool.isEmpty() int last = pool.size() - 1;Connection con =pool.remove(last);return con; Connection con= provider.getConnection(); return con; /* 把连接返回连接池 */ public void releaseConnection(Connection con) throws SQLException synchronized (pool) int currentSize = pool.size(); if( currentSize 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() 读方法(key); if (key.isWritable() 写方法(key); catch(IOException e) e.printStackTrace(); try if(key!=null) key.cancel(); key.channel().close(); catch(Exception ex)e.printStackTrace(); 6 封装数据库的增删改查的工具类的实现。import java.sql.*;public class ConnectionProvider private String JDBC_DRIVER; private String DB_URL; private String DB_USER; private String DB_PASSWORD; public ConnectionProvider() JDBC_DRIVER=PropertyReader.get(JDBC_DRIVER); DB_URL=PropertyReader.get(DB_URL); DB_USER=PropertyReader.get(DB_USER); DB_PASSWORD=PropertyReader.get(DB_PASSWORD); try Class jdbcDriver=Class.forName(JDBC_DRIVER); java.sql.DriverManager.registerDriver(Driver)jdbcDriver.newInstance(); catch(Exception e)e.printStackTrace(); public Connection getConnection()throws SQLException Connection con=java.sql.DriverManager.getConnection( DB_URL,DB_USER,DB_PASSWORD); return con; 再写个类实现添删改查及关闭数据库的操作7 RowSet完成增删改查的例子/插入记录 rowset.moveToInsertRow(); rowset.updateString(name,小王); rowset.updateInt(age,25); rowset.updateString(address,上海); rowset.insertRow(); /插入一条记录 rowset.moveToCurrentRow(); /把游标移动到插入前的位置 rowset.acceptChanges(con); con.close();/更新记录 rowset.updateString(name,小王); rowset.updateInt(age,29); rowset.updateString(address,安徽); rowset.updateRow(); /更新当前记录 rowset.acceptChanges(con); con.close();/删除记录 resultSet.deleteRow(); /删除当前记录 rowset.acceptChanges(con); co
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 岳阳市中烟工业2025秋招特色知识题库速记含答案口诀
- 2025年度航空航天零部件加工与供应合同
- 2025年度婚礼庆典酒席场地租赁合同模板
- 2025年展览设计师职业资格考试试卷及答案
- 2025年精麻药品培训试卷(附答案)
- 黔东南苗族侗族自治州烟草公司2025秋招行政管理岗位面试模拟题及答案
- 2025年电力调度员专业技能模拟试题含参考答案
- 2025四川经纬教育管理集团有限公司招聘2人考试参考题库及答案解析
- 中国邮政集团2025日照市秋招面试结构化模拟30问及话术
- 2025重庆铜梁区小林镇公益性岗位招聘2人公告考试参考题库及答案解析
- 汉书-张骞传课件
- 民法典侵权责任编课件
- 计量基础知识讲稿课件
- 市政道路养护工程监理工作
- 2022年初中化学新课标测试
- 练平舌音和翘舌音的绕口令
- 校企合作讲座精品PPT课件
- 医学检验师考试试题
- 煤矿电缆与电缆敷设标准
- T∕CATCM 008-2019 阿胶质量规范
- 防水堵漏施工合同
评论
0/150
提交评论