当前位置:文档之家› 最新java网络编程试卷及答案

最新java网络编程试卷及答案

最新java网络编程试卷及答案
最新java网络编程试卷及答案

A1、Java网络程序位于TCP/IP参考模型的哪一层?(B)a) 网络层互联层b) 应用层c) 传输层网络d) 主机-网络层

2、以下哪些协议位于传输层?(A D)a) TCP b) HTTP c) SMTP d) UDP f)IP

3、一个服务器进程执行以下代码:ServerSocket serverSocket=new ServerSocket(80);Socket socket=serverSocket.accept(); int port=socket.getPort();以下哪些说法正确?(A C D)a) 服务器进程占用80端口。b) socket.getPort()方法返回服务器进程占用的本地端口,此处返回值是80。c) 当serverSocket.accept()方法成功返回,就表明服务器进程接收到了一个客户连接请求。d) socket.getPort()方法返回客户端套节字占用的本地端口。

4、在客户/服务器通信模式中,客户与服务器程序的主要任务是什么?(B C)a) 客户程序在网络上找

到一条到达服务器的路由。b) 客户程序发送请求,并接收服务器的响应。c) 服务器程序接收并处理客

户请求,然后向客户发送响应结果。d) 如果客户程序和服务器都会保证发送的数据不会在传输途中丢

失。1、B 2、A D 3、A C D 4、B C

二、填空题(邮件)1、名词解释SMTP:()

2

三、简答题(线程池)写出五种使用线程池时应注意的事项,并进行简要说明?

线程池可能会带来种种风险:1.死锁2.系统资源不足3.并发错误4.线程泄漏5.任务过载

使用线程池时需要遵循以下原则:(1)如果任务A在执行过程中需要同步等待任务B的执行结果,那

么任务A不适合加入到线程池的工作队列中。(2)如果执行某个任务时可能会阻塞,并且是长时间的

阻塞,则应该设定超时时间,避免工作线程永久的阻塞下去而导致线程泄漏。(3)根据任务的特点,对

任务进行分类,然后把不同类型的任务分别加入到不同线程池的工作队列中,这样可以根据任务的特点,

分别调整每个线程池。(4)调整线程池的大小。线程池的最佳大小主要取决于系统的可用CPU的数目

以及工作队列中任务的特点。(5)避免任务过载。

四、JAVA对客户程序的通信过程进行了抽象,提供了通用的协议处理框架,请用UML图显示客户端协议处理框架的主要对象模型。(20分)

五、编程题

用JAVA编写客户、服务器程序(利用ServerSocket和Socket编写)

1、创建EchoServer(写出主要程序代码并注释

2、输出流输入流通用方法

3、EchoServer类最主要方法为service()

方法,写出其方法中的代码。4、写出创建EchoClient的构造方法5、EchoClient类中,最主要的方法为talk()方法,写出其方法源代码。

public EchoServer() throws IOException {

serverSocket = new ServerSocket(port);

System.out.println("服务器启动"); }

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 service() {

while (true) { Socket socket=null;

try { socket = serverSocket.accept(); //等待客户连接

System.out.println("New connection accepted "

+socket.getInetAddress() + ":" +socket.getPort());

BufferedReader br =getReader(socket);

PrintWriter pw = getWriter(socket);

String msg = null; }

public EchoClient()throws IOException{

socket=new Socket(host,port); }

B一选择题下列各题A、B、C、D四个选项中,只有一个选项是正确的。请将正确的结果打√

1、问题:关于ServerSocket构造方法的backlog参数,以下哪些说法是正确的?(a b d f)

a) backlog参数用来显式设置操作系统中的连接请求队列的长度。b)如果没有设置backlog参数,那么连接请求队列的长度由操作系统决定。c)当服务器端的连接请求队列已满,客户端就无法建立与服务器的连接。d)如果backlog参数的值大于操作系统限定的队列的最大长度,那么backlog参数被忽略。e)连接请求队列直接由ServerSocket创建并管理。f) ServerSocket的accept()方法从连接请求队列中取出连接请求。

2、问题:对于以下程序代码:

ServerSocket serverSocket=new ServerSocket(8000);serverSocket.setReuseAddress(true); 哪个说法是正确的?(C)a)以上代码运行时出错b)以上代码编译时出错c)以上代码尽管编译和运行不会出错,但对SO_REUSEADDR选项的设置无效d)以上说法都不正确

3、如何判断一个ServerSocket已经与特定端口绑定,并且还没有被关闭?(B)

a) boolean isOpen=serverSocket.isBound(); b)boolean isOpen=serverSocket.isBound() && !serverSocket.isClosed();

c) boolean isOpen=serverSocket.isBound() && serverSocket.isConnected(); d) boolean isOpen=!serverSocket.isClosed(); 4、问题:对于以下代码:int n=socketChannel.read(byteBuffer); //假定n>=0 byteBuffer.flip();

假定执行socketChannel.read(byteBuffer)方法前,byteBuffer的容量、极限和位置分别为c、l和p,执行完以上代码后,byteBuffer

的容量、极限和位置分别是多少?B a) 容量为c,极限为l,位置为p+n b) 容量为c,极限为p+n,位置为0 c) 容量为l,极限为p+n,位置为0 d) 容量为c,极限为p+n,位置为p+n

5、问题:线程执行Selector对象的select(long timeout)方法时进入阻塞状态,在哪些情况,线程会从select()方法中返回? (abde)

a) 至少有一个SelectionKey的相关事件已经发生。b) 其他线程调用了Selector对象的wakeup()方法。c) 与Selector 对象关联的一个SocketChannel对象被关闭。

d) 当前执行select()方法的线程被其他线程中断。e) 超出了等待时间。

6、问题:在HTTP响应结果中,哪个状态代码表示响应成功?

选项:D a)404 b)405 c)500 d)200

7、问题:对于HTTP的GET请求方式,用户提交的表单数据位于HTTP请求的哪一部分?A

选项:a) 请求头中b)请求正文中

一、选择题1、a b d f 2、c 3、b 4、b 5、abde 6、d 7、a

二、JAVA对客户程序的通信过程进行了抽象,提供了通用的协议处理框架,请用UML图显示客户端协议处理框架

的主要对象模型。

三、填空题

HTTP协议规定,HTTP请求由3部分构成,分别是:

请求:

请求方式、URI、HTTP协议版本

请求头

请求正文

与HTTP请求相似,HTTP响应也由3部分构成,分别是:

响应:

HTTP协议版本、状态代码、描述

响应头

响应正文

四、编程题

创建非阻塞的EchoServer 1、处理接收连接就绪事件2、处理读就绪事件3、处理写就绪事件4、编码与解码

5、在非阻塞模式下确保发送一行数据6、删除ByteBuffer中的已处理数据

//创建一个Selector对象

selector = Selector.open();

//创建一个ServerSocketChannel对象

serverSocketChannel= ServerSocketChannel.open();

//使得在同一个主机上关闭了服务器程序,紧接着再启动该服务器程序时,

//可以顺利绑定到相同的端口

serverSocketChannel.socket().setReuseAddress(true);

//使ServerSocketChannel工作于非阻塞模式

serverSocketChannel.configureBlocking(false);

//把服务器进程与一个本地端口绑定

serverSocketChannel.socket().bind(new InetSocketAddress(port));

public void service() throws IOException{

serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT );

while (selector.select() > 0 ){ //第一层while循环

Set readyKeys = selector.selectedKeys(); //获得Selector的selected-keys集合

Iterator it = readyKeys.iterator();

while (it.hasNext()){ //第二层while循环

SelectionKey key=null;

try{ //处理SelectionKey

key = (SelectionKey) it.next(); //取出一个SelectionKey

it.remove(); //把SelectionKey从Selector的selected-key集合中删除

if (key.isAcceptable()) {处理接收连接就绪事件; }

if (key.isReadable()) {处理读就绪事件; }

if (key.isWritable()) {处理写就绪事件; }

}catch(IOException e){

}catch(IOException e){

e.printStackTrace();

try{ if(key!=null){

//使这个SelectionKey失效,

//使得Selector不再监控这个SelectionKey感兴趣的事件

key.cancel(); key.channel().close(); //关闭与这个SelectionKey关联的SocketChannel

} }catch(Exception ex){e.printStackTrace();}

} }//#while }//#while}

相关主题
文本预览
相关文档 最新文档