【附注信息 ----> 关注公众号:CS阿吉,大家一起分享更多的技术文章,聊天技术问题。】
2020-04-23 第一阶段测试
一、填空题 (题数:3,共 30.0 分)
1
class GetPort{ 共享资源类
(_________) int port; 共享的端口
public GetPort(int port){ 构造方法
this.port = port;
}
(_________) int getPort(){ 获得端口累加号
return port++;
}
}
class ScanThread extends (_________){ 扫描端口线程类
String host; 目标主机
GetPort port; 共享的端口资源
Thread t; 主线程
String name; 子线程名称
public ScanThread(String host, GetPort port, String name, Thread t){ 构造方法
this.host = host;
this.t = t;
this.port = port;
this.name = name;
}
(_________)(){ 线程运行方法
try{
Socket s = new (_________)();
RandomAccessFile raf;
int p = 0;
while((p = port.getPort())<(_________)){
SocketAddress inet = new (_________)(host, p);
s.(_________)(inet, 5000);
if(s.(_________)()){
raf = new RandomAccessFile("record.dat", "rw");
raf.(_________)(raf.length());
raf.(_________)(p);
raf.close();
}
}
s.close();
}(_________)(Exception e){
e.printStackTrace();
}(_________){
try{
t.(_________)();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
class mainThread{ 主类
public static void main(String [] args){ 主方法
int flag = 0; 线程累计数
String host; 目标主机
Thread t = Thread.currentThread(); 获得主线程
GetPort p = new GetPort(0); 共享的端口累加资源
try{
host = (new (_________)(System.in)).next();
for(int i=0; i<10; i++){
(new ScanThread(host, p, "Thread-"+i, t)).(_________);
while(flag < 10){ 采用唤醒等待的方法,保证子线程都正常结束
synchronized(t){
flag++;
t.(_________)();
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
(10.0分)
我的答案:
第一空:
private
synchronized
Thread
public void run
Socket
65535
InetSocketAddress
connect
isReachable
seek
writeUTF
catch
finally
close
Scanner
start
wait
2
/* xml格式如下
<books>
<book>
<name></name>
<price></price>
</book>
</books>
*/
import java.util.List;
import java.io.RandomAccessFile;
import (_________)ByteBuffer;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
class TransferDataFromXMLtoFILE{
public static void main(String [] args){
try{
SAXReader reader = (_________);
Document document = reader.(_________)("books.xml"); 打开xml文件
Element root = document.(_________)();
List<(_________)> list = root.elements("book");
RandomAccessFile raf = new RandomAccessFile("books.dat", "rw");
FileChannel fc = (_________)();
String msg = null;
ByteBuffer buf = ByteBuffer.(_________)(256);
while(list.(_________)()){
Element bookE1 = (_________)list.next();
msg = bookE1.elementText("name");
msg += bookE1.elementText("price");
buf.(_________)();
buf.put(msg.(_________)());
buf.(_________)();
while(buf.(_________)())
fc.write(buf);
}
fc.close();
raf.close();
reader.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
(10.0分)
我的答案:
第一空:
java.nio.
new SAXReader()
read
getRootElement()
Element
raf.getChannel()
allocate
isEmpty
Element
clear
getBytes
flip
hasRemaining
3
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.Channel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
public class ChatRoomServer {
private Selector selector = null; 事件选择器
static final int port = 9999;
public void init() throws IOException
{
selector = Selector.(_________)(); 获得selector对象
ServerSocketChannel server = ServerSocketChannel.(_________)(); 获得channel对象
server.(_________)(new InetSocketAddress(port));
server.configureBlocking(_________);
server.register(selector, (_________)); 注册监听事件
System.out.println("Server is listening now...");
while(true) {
int readyChannels = selector.select();
if(readyChannels == 0) continue;
Set selectedKeys = selector.(_________)(); 获得事件列表
Iterator keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext()) {
SelectionKey sk = (SelectionKey) keyIterator.next();
keyIterator.(_________)(); 移除已处理过的事件
dealWithSelectionKey(server,sk);
}
}
}
public void dealWithSelectionKey(ServerSocketChannel server,SelectionKey sk) throws
IOException {
if(sk.isAcceptable()) 有连接请求
{
SocketChannel sc = server.(_________)();
sc.(_________)(false);
sc.register(selector, SelectionKey.OP_READ);
sk.interestOps(SelectionKey.OP_ACCEPT);
}
if(sk.isReadable()) 有数据到达
{
SocketChannel sc = (SocketChannel)sk.(_________)();
ByteBuffer buff = ByteBuffer.(_________)(1024);
StringBuilder content = new StringBuilder();
try
{
while(sc.read(buff) > 0)
{
buff.(_________)();
content.append(buff);
}
System.out.println(content);
sk.(_________)(SelectionKey.OP_READ); 追加关注事件
}
catch (IOException io)
{
sk.cancel();
if(sk.channel() != null)
{
sk.channel().close();
}
}
}
}
public static void main(String[] args) throws IOException
{
new ChatRoomServer().init();
}
}
(10.0分)
我的答案:
第一空:
open
open
bind
false
selectionKey.OP ACCEPT
selectedKeys
remove
accept
configureBlocking
channel
allocate
flip
interestOps
------------------------------------------
一、论述题 (题数:1,共 10.0 分)
1
-
编写 一对一 的服务器和客户端程序
1) 服务器端开启8080端口,并只接收1个客户端的连接
2) 服务器确认客户端连接后,发送“ welcome to my Server”字符串
3) 客户端收到欢迎信息后,发送 你的姓名和学号。
(10.0分)
我的答案
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
public class Client {
public static void main(String[] args)throws Exception
{
InetAddress ip = InetAddress.getByName("192.168.1.1");
Socket s = new Socket(ip, 8899);
PrintStream ps = new PrintStream(s.getOutputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = null;
while(null != (str=br.readLine()))
{
ps.println(str);
}
}
}
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception
{
ServerSocket server = new ServerSocket(8899);
Socket s = server.accept();
System.out.println("welcome to my Server");
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String str=null;
while(null != (str=br.readLine()))
{
System.out.println("Client应答:"+str);
}
}
}
------------------------------------------
一、论述题 (题数:1,共 10.0 分)
1
-
有以下学生信息info.xml,采用NIO方式转存到 学号-姓名.txt 文件中
<?xml version="1.0" encoding="utf-8"?>
<students>
<student>
<id>12345</id>
<name>宋江</name>
<major>行政管理</major>
</student>
<student>
<id>23456</id>
<name>吴用</name>
<major>计算机</major>
</student>
</students>
1) 采用DOM4J的解析方法,引用以下类库
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
基本操作
SAXReader reader = new SAXReader();
Document document = reader.read("info.xml");
Element element = document.getRootElement();
遍历的方法
public static void treeWalk(Element element) {
for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {
Node node = element.node(i);
if ( node instanceof Element ) {
System.out.println(node.getName() + "-" + node.getText());
treeWalk( (Element) node );
} } }
2) NIO的使用方法
RandomAccessFile raf = new RandomAccessFile
FileChannel fc = raf.getChannel(); 获得channel
ByteBuffer buf = ByteBuffer.allocate(64);
将xml中数据put到buf中,加载完毕后要调用 ByteBuffer.flip 方法
再将buf数据write到channel中
while(buf.hasRemaining()) {
channel.write(buf);
}
(10.0分)
我的答案
public class Util {
public static void main(String[] args) throws java.io.IOException{
Person p1 = new Person("04172066","刘鑫海",22);
java.io.File file = new java.io.File("C:\\04172066刘鑫海.txt");
java.io.BufferedWriter bw = new java.io.BufferedWriter(new java.io.OutputStreamWriter(new java.io.FileOutputStream(file)));
bw.write("学号:" + p1.id);
bw.write("\r\n姓名:" + p1.name);
bw.write("\r\n性别:" + p1.age);
bw.flush();
bw.close();
}
}
class Person{
public String id;
public String name;
public int age;
public Person(String id, String name, int age){
this.id = id;
this.name = name;
this.age = age;
}
}
-----------------------------------------
1
-
假设你的IP地址是192.168.0.100,现在需要探测目标C类网络(222.24.16.0)中主机可连通数,将可连通主机的IP地址保存在文件中(学号-姓名.dat)。
思路:
1) 一个C类网络主机数254台,必须开启多线程,设立共享的资源主机号
线程的构成方法中,至少包括 (线程名称、共享资源)
class GetPort{
private int host = 0;
( ) int getHost(){
return ( );
}
}
class ScanThread extends Thread{
public ScanThread(String threadName, GetPort gp)
public void run(){
……………..
}
}
2) 你的IP地址是内网地址,目标网络是外网,在探测过程中可能受到防火墙的阻塞,建议采用ping的方法,根据返回的字符串判断 目标主机是否能连通
Process pro = Runtime.getRuntime().exec("ping " + ipAddress);
BufferedReader buf = new BufferedReader(
new InputStreamReader(pro.getInputStream()));
要逐行读取,判断是否能连通目标主机
3) 将可连通的IP地址保存在 学号-姓名.dat 中
设主机IP为 String host
FileOutputStream fos = new FileOutputStream(
fos.write(主机IP的字节数组形式)
(10.0分)
我的答案
package com.zhu.experiment1;
public class GetHost{
private int host = 0;
public GetHost(){ }
synchronized int add(){
return ++host;
}
}
package com.zhu.experiment1;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.net.InetAddress;
public class ScanThread extends Thread{
private GetHost host ;
private String netid;
public ScanThread(String netid, GetHost host){
this.host = host;
this.netid = netid;
}
public void run(){
try{
int i;
while((i = host.add()) < 255) {
String ip = netid + "." + i;
RandomAccessFile raf = new RandomAccessFile(new File("E:\\04172066-刘鑫海.dat"), "rw");
Process pro = Runtime.getRuntime().exec("ping " + ip);
BufferedReader buf = new BufferedReader(
new InputStreamReader(pro.getInputStream()));
String line;
while ((line = buf.readLine()) != null) {
if(line.indexOf(ip) > 0){
raf.seek(raf.length());
raf.writeBytes(ip + "\r\n");
}
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
package com.zhu.experiment1;
public class SumDemo{
public static void main(String [] args) throws Exception{
GetHost host = new GetHost();
ScanThread st1 = new ScanThread("222.24.16", host);
st1.start();
st1.join();
}
}
=--------------------------------------
一、多选题 (题数:1,共 1.0 分)
1
以下()是NIO的三要素
(1.0分)
- A、
Buffer
- B、
Channel
- C、
Cache
- D、
Selector
我的答案:ABD
二、单选题 (题数:9,共 9.0 分)
1
FileWriter是字节输出流
(1.0分)
- A、
正确
- B、
错误
我的答案:B
2
new RandomAccessFile(file, true)表示可以file尾部进行追加内容操作
(1.0分)
- A、
正确
- B、
错误
我的答案:B
3
Buffer属性中position表示
(1.0分)
- A、
最大容量
- B、
缓冲当前操作位置
我的答案:B
4
Buffer的flip()表示
(1.0分)
- A、
将limit设置为position值,并将position设置为0
- B、
将limit设置为capacity值,并将capacity设置为最大
我的答案:A
5
用户向Buffer写数据方法是
(1.0分)
- A、
put
- B、
write
我的答案:A
6
获得File的Channel方法是
(1.0分)
- A、
FileChannel ch = new Channel(filename);
- B、
FileInputStream f = new FileInputStream(filename);
FileChannel ch = f.getChannel();
我的答案:B
7
StringTokenizer是利用()形式拆分字符串
(1.0分)
- A、
正则表达式
- B、
对象
我的答案:B
8
XML文件的第一行往往是
(1.0分)
- A、
根元素
- B、
文件XML版本和编码申明
我的答案:B
9
JSON文件中{ }表示
(1.0分)
- A、
数组
- B、
对象
我的答案:B
----------------------------
一、单选题 (题数:9,共 9.0 分)
1
InetAddress类的作用
(1.0分)
- A、
实现主机名与IP地址的关联
- B、
•实现目标主机的连通性探测
我的答案:A
2
isReachable使用ICMP协议
(1.0分)
- A、
正确
- B、
错误
我的答案:A
3
以下哪个InetAddress的getByName方法使用是正确的
(1.0分)
- A、
InetAddress inet = new InetAddress.getByName("www.xupt.edu.cn");
- B、
InetAddress inet = InetAddress.getByName("www.xupt.edu.cn");
我的答案:A
4
使用getByName实例化对象时,如果使用的IP地址不符合规则,例如(“322.24.12.700”),则会抛出什么异常
(1.0分)
- A、
UnknowHostException
- B、
IllegalArgumentException
我的答案:A
5
使用InetAddress.getAddress()获得对象IP地址为"222.24.12.128",如
byte[] bytes =
addr.getAddress();//获取字节数组形式的
那么通过语句的结果为
for(byte b: bytes)System.out.print(b+".");
(1.0分)
- A、
222.24.12.128.
- B、
-34.24.12.-128.
我的答案:B
6
Java通过以下( )调用外部ping命令
(1.0分)
- A、
Runtime.getEnvironment().exec("ping -c 1 222.24.101.1")
- B、
Runtime.getRuntime().exec("ping -c 1 222.24.101.1")
我的答案:B
7
在JAVA语言中( )是给按钮组件增加一个按键监听 该按键是否被按下事件
(1.0分)
- A、
button.addActionListener(new ActionListener());
- B、
button.addClickListener(new ActionListener());
我的答案:A
8
( )是申明Vector对象内元素为String类型的语句
(1.0分)
- A、
Vector<String> rs = new Vector<String>();
- B、
Vector String rs = new Vector(10);
我的答案:B
9
在Java中使用implement Runnable接口的类实例化对象后,以下哪项是错误的
class WorkLine implement Runnable{}
(1.0分)
- A、
WorkLine wl = new WorkLine();
wl.start();
- B、
WorkLine wl = new WorkLine();
Thread t = new Thread(wl);
t.start();
我的答案:A
二、多选题 (题数:1,共 1.0 分)
1
在JAVA的网络编程中,需要引入以下哪个类库
(1.0分)
- A、
java.io.*
- B、
java.util.*
- C、
java.net.*
我的答案:B
---------------------------------------------
1 NIO中( )是Buffer的状态值 (1.0分) A、 capacity B、 postion C、 limit D、 head 我的答案:ABC 2 ( )是SelectionKey的常量 (1.0分) A、 OP_ACCEPT B、 OP_CONNECT C、 OP_READ D、 OP_WRITE 我的答案:ABCD 3 以下( )句正确 (1.0分) A、 SocketAddress sa = new InetSocketAddress("localhost", 8080); B、 InetAddress inet = InetAddress.getByName("localhost"); 我的答案:AB 二、单选题 (题数:7,共 7.0 分) 1 SelectableChannel中的 register方法用于 (1.0分) A、 注册监听端口号 B、 注册监听事件 我的答案:B 2 在SocketChannel中设置非阻塞模式的方法是( ) (1.0分) A、 socketChannel.configureBlocking(false); B、 socketChannel.configureBlocking(true); 我的答案:A 3 Hashtable存储的是( ) (1.0分) A、 对象 B、 键值对 我的答案:B 4 Socket.getPort方法获得( ) (1.0分) A、 对方端口号 B、 本地端口号 我的答案:B 5 new ServerSocket(8000)表示,8000端口的状态是 (1.0分) A、 ESTABLISHED B、 LISTENNING 我的答案:B 6 Socket的由( )组成 (1.0分) A、 IP,port B、 protocol, IP, port 我的答案:A 7 http的默认端口是( ),https的默认端口是( ) (1.0分) A、 80, 443 B、 80, 334 我的答案:A
--------------------------------------
URL类对象可以执行POST操作 (1.0分) A、 是 B、 否 我的答案:B 2 www.xupt.edu.cn是正确的URL地址 (1.0分) A、 是 B、 否 我的答案:B 3 URL类的openStream()方法是创建一个 (1.0分) A、 InputStream B、 OutputStream 我的答案:A 4 以下语句说明 Value = new String(Value.getBytes(“utf8”), “GBK”); (1.0分) A、 字符编码由utf8转为gbk B、 字符编码由gbk转为utf8 我的答案:A 5 URLConnection类是URL类的子类 (1.0分) A、 是 B、 否 我的答案:A 6 URLConnection提供了对HTTP首部的访问 (1.0分) A、 是 B、 否 我的答案:A 7 当访问服务器页面成功时,返回代码 (1.0分) A、 200 B、 404 我的答案:A 8 HttpClient是否支持https访问 (1.0分) A、 不支持 B、 支持 我的答案:B 9 JEditPane属于 (1.0分) A、 AWT控件组 B、 swing控件组 我的答案:B 二、多选题 (题数:1,共 1.0 分) 1 URLConnection类可以使用以下( )获得流 (1.0分) A、 getInputStream() B、 getOutputStream() C、 openStream() 我的答案:AB