目录:
(1)汇总题
选择,填空,简答,编程
(2)考前模拟
(3)课堂测试题
一. InetAddress, 二. URL,三. IO, 四. 综合, 五. 测试一,六. 测试二,七. 测试三,八. 综合测试
java在线运行网址:tool.lu/coderunner/
--------------------------------------------
1在UDP中发送数据报的方法名( )
-
2 定制序列化需要实现 ( ) 接口
-
3 Java序列化需要使用的流是( )
-
4 Java反序列化需要使用的流是 ()
-
5 Java中UDP的数据报类 ( ) DatagramPacket
-
6 Java提供的安全的客户端套接字类为 (),对应的工厂类()
send Serializable
ObjectOutputStream ObjectlnputStream
7 序列化的作用是将对象转变为() 一个字节数组
8 JDK中提供的公私钥密钥管理应用为 ( ) KeyTool
9 Cipher类的加密模式常量为 (),Cipher类的解密模式常量为() 第一空:ENCRYPT_ MODE 第二空:DECRYPT_ MODE
11Java提供的认证和授权服务简称为 (),提供的安全套接字扩展简称为() 第一空:JAAS第二空:JSSE
12定制序列化需要覆盖的序列化方法是( ) readObject
1 3 Java提供的安全的服务 器套接字类为(),对应的工厂类() 第一空:ServerSocket第二空:ServerSocketFactory
14实现序列化的方法是() Serializable
15反序列化的作用是将 ( ) 转变为对象 byte
1 6定制序列化需 要覆盖的反序列化方法是() writeObject
1 7 Java中UDP多播/组播类() MulScastSocket
1 8 Java对DSA提供的签名类是 ( ) DSAKey
19十进制56与十六进制0x3E的按位异或的十进制结果是() 6
20 Java中UDP的套接宇类 () DatagramSocket
21在通信中,防止被窃听可以对数据进行( ) 操作,保证数据的完整性和可靠性,可以进行( ) 操作
第一空:加密 第二空:序列化
22 UDP配置非阳塞的方法 () reccfrom
23将byte类 型数值14循环右移5位的十进制结果是( ) 0
24在所有的破解中,暴力破解(即枚举法) 最容易实现,其依赖于的可能密钥的数据集合被称为( )
第一空:
25 Cipher类通过 ()方法指定加密算法与模式 getInstance
26在JCA中安全架构类为 ( ) ,JCE中提供的基于密钥加密的类为( )
第一空:
第二空:
27 Java中安全被拆分为两个部分:不含加密功能的java安全架构简称为( ) ,含加密功能的Java安全扩展简称
第一空:JCA 第二空:JCE
28在UDP中 接收数据报的方法名() getData
29序列化中用于修饰成员变量为短暂的关键字 () transient
第一空:Socket 第二空:SocketFactory
考前模拟:
-
使用NIO获得一个FileChannel,所用的方法是 getChannel
-
套接字编程中的三要素是 Port ,IP ,Transfer Protocol
-
在JAVA RMI编程中,两个标准机制分别是 (stub) 和 (skeleton)
-
JDBC中Connection, Statement, ResultSet作用:Connection创建执行SQL语句对象,管理事务Statement 执行SQL,执行批处理
ResultSet 结果集的遍历
InetAddress类
1. InetAddress类的作用:实现主机名与IP地址的关联
2.isReachable使用ICMP协议: 正确
3.以下哪个InetAddress的getByName方法使用是正确的:InetAddress inet =InetAddress.getByName("www.xupt.edu.cn");
(含义:getByName在给定主机名的情况下确定主机的IP地址;如果参数为null,获得的是本机的IP地址)
4.使用getByName实例化对象时,如果使用的IP地址不符合规则,例如(“322.24.12.700”),则会抛出什么异常?UnknowHostException
5.Java通过以下()调用外部ping命令? Runtime.getRuntime().exec("ping -c 1 222.24.101.1")(分析:JAVA执行外部命令主要通过调用
平台的shell去完成。Runtime.getRuntime().exec() 克隆一个和当前虚拟机拥有相同环境变量的进程,再利用新进程去执行外部命令,最
后推出新进程。频繁执行此命令,系统消耗大,CPU、内存负担很重)
6. 在JAVA语言中( )是给按钮组件增加一个按键监听 该按键是否被按下事件?button.addActionListener(new ActionListener());
7.( )是申明Vector对象内元素为String类型的语句? Vector<String> rs = new Vector<String>();
URL
1.URL类对象不可以执行POST操作
2.www.xupt.edu.cn 是错误的URL地址
3.URL类的openStream()方法是创建一个 InputStream
4.以下语句说明 Value = new String(Value.getBytes(“utf8”), “GBK”); 字符编码由utf8转为gbk
5.URLConnection类不是URL类的子类
6. URLConnection提供了对HTTP首部的访问
7.当访问服务器⻚面成功时,返回代码 : 200
8. HttpClient支持https访问
9. JEditPane属于 swing控件组
10.URLConnection类可以使用以下( )获得流?getInputStream(), openStream()
IO
1. 以下()是NIO的三要素? Buffer, Channel,Selector
2.FileWriter是字符输出流
3.new RandomAccessFile(file, true) 表示不可以file尾部进行追加内容操作
4.Buffer属性中position表示 缓冲当前操作位置
5.Buffer的flip()表示: 将limit设置为position值,并将position设置为0
6.用户向Buffer写数据方法是 put
7.获得File的Channel方法是 FileInputStream f = new FileInputStream(filename);FileChannel ch = f.getChannel();
8. StringTokenizer是利用(对象)形式拆分字符串
9.XML文件的第一行往往是 文件XML版本和编码申明
综合
1.NIO中( )是Buffer的状态值: position,limit,capacity
2.( )是SelectionKey的常量: OP_ACCEPT , OP_CONNECT, OP_READ ,OP_WRITE
3. 以下( )句正确SocketAddress sa = new InetSocketAddress("localhost", 8080);InetAddress inet =
InetAddress.getByName("localhost");
4.SelectableChannel中的 register方法用于: 注册监听事件
5.在SocketChannel中设置非阻塞模式的方法是( ): socketChannel.configureBlocking(false);
6. Hashtable存储的是( 对象 ) Socket.getPort方法获得 本地端口号
7.new ServerSocket(8000)表示,8000端口的状态是 LISTENNING
8.Socket的由( IP,port )组成
9. http的默认端口是( 80 ),https的默认端口是( 443 )
I/ O包括四个抽象基类:字节输入流InputStream,字节输出流OutputStream,字符输入流Reader,字符输出流Writer
NIO包括几个不同区:
(1)缓冲区Buffer:有以下几个属性
容量capacity:表示缓冲区能存多少数据。
极限limit:表示缓冲区当前终点,不能对缓冲区中超过极限的区域进行读写。
位置position:表示缓冲区中下一个读写单元的位置,每次读写缓冲的数据时,都会改变该值,为下次读写数据做准备。
标记mark:表示记录当前position的位置,通过reset()恢复到mark位置。
缓冲区有以下类型:ByteBuffer, charBuffer, shortBuffer,IntBuffer, LongBuffer, FloatBuffer, DoubleBuffer
(2)通道Channel:用来连接缓冲区与数据源或数据目的地。
如何构建:1. Socket通道: 使用ServerSocketChannel类具有负责接收客户连接的accept()方法,要用它的静态工厂方法open()来创建ServerSocketChannel。SocketChannel类通过它的静态工厂方法open()来创建SocketChannel 。以及DatagramChannel类。
2. FileChannel对象可以通过一个打开的RandomAccessFile, FileInpuyStream, FileOutputStream的getChannel方法得到。
(3)选择器selector:只要SeverSocketChannel向Selector注册了指定的事件,Selector就监控这些时间是否发生。如何注册?
SelectableChannl的register()方法负责注册事件,该方法返回一个SelectionKey ,对象,该对象是用于跟踪这些被注册事件的句柄。
TCP包括
1. Socket类:提供了getInputStream()方法和getOutputStream()方法,分别返回输入流InputStream对象和输出流OutputStream对象。
2. ServerSocket类构造方法负责在操作系统中把当前进程注册为服务器进程。服务器程序接下来调用ServerSocket对象的accept()方法,该方法会一直监听端口,等待客户的连接和请求,若收到连接请求,accpet()方法就会返回一个Socket对象。这个Socket对象与客户端的Socket对象形成一条通信线路。
UDP包括
3. DatagramSocket类用来发送和接收数据报包的套接字,DatagramPacket类表示数据报文,用于处理报文。将Byte数组,目标地址,目标端口等数据包装成报文,或者将报文拆卸为Byte数组。
4. MulticastSocket()组播通信。用joinGroup()加入到组播组,leaveGroup()离开组播组。
HTTP协议 包括HTTP请求和HTTP响应
HTTP请求包括
1.请求方式,URL(统一资源定位符),http协议版本
请求方式:常用的:get,post
不常用的:head、put、delete
①get方式:客户端访问服务器的一个文档,服务器将文档传给客户端。
②post方式:客户端将信息发送给服务器,除了访问URL,还有请求正文。
- 2.请求头部
头部包含有关客户端的环境和请求正文的有用信息:浏览器类型(代码中出现agent),所用语言(出现language),请求正文类型(出现content type),请求正文长度(出现length),远程主机(出现Host)。
3.请求正文
头部拆分,代码
POST代表请求方式
/hello.htm代表URL
HTTP/1.1代表版本协议
HTTP响应包括
- HTTP协议的版本、状态代码、描述
响应的第一行包括HTTP协议的版本、状态代码、描述
状态代码,三位数字组成
1××:信息提示,临时响应
2××:响应成功,服务器成功接收客户端请求
3××: 重定向
4××: 客户端错误,表明客户端请求了不正确的资源或请求格式错误。
5××: 服务器错误,表明服务器遇到了某种错误不能响应客户端请求。
- 响应头(Response Header)
包含服务器类型,正文类型,正文长度等信息。
- 响应正文(Response Content)
响应正文就是服务器返回的具体的文档,最常见HTML
文档。
RMI:JDK提供的一个完善的、简单易用的远程方法调用框架,要求客户端与服务器端都是Java程序。封装了底层的通信细节。
采用客户/服务器通信方式,在服务器上部署了提供各种服务的远程对象,客户端请求访问服务器上的方法。
创建RMI框架:
- 1.创建远程接口:继承java.rmi.Remote接口
- 2.创建远程类:实现远程接口
- 3.创建服务器程序:负责在rmiregistry注册表中注册远程对象
- 4.创建客户程序:负责定位远程对象,并且调用远程对象的方法。
--------------------------------------------
考前模拟:
1.使用NIO获得一个FileChannel,所用的方法是 getChannel
2.套接字编程中的三要素是 Port ,IP ,Transfer Protocol
3.在JAVA RMI编程中,两个标准机制分别是 (stub) 和 (skeleton)
4. JDBC中Connection, Statement, ResultSet作用:
Connection创建执行SQL语句对象,管理事务
Statement 执行SQL,执行批处理
ResultSet 结果集的遍历
5. 以下实现了一个探测某主机开发TCP端口的RMI分布服务,补充完善。
第一空: java.rmi.Remote
第二空: implements ScanPort
第三空: RemoteException
第四空: createRegistry(3000)
第五空:rebind
--------------------------------------------
一. InetAddress
1. InetAddress类的作用:实现主机名与IP地址的关联
2. isReachable使用ICMP协议: 正确
3. 以下哪个InetAddress的getByName方法使用是正确的: InetAddress inet = InetAddress.getByName("www.xupt.edu.cn");
(含义:getByName在给定主机名的情况下确定主机的IP地址;如果参数为null,获得的是本机的IP地址)
4. 使用getByName实例化对象时,如果使用的IP地址不符合规则,例如(“322.24.12.700”),则会抛出什么异常?UnknowHostException
5. 使用InetAddress.getAddress()获得对象IP地址为"222.24.12.128",如byte[] bytes = addr.getAddress();//获取字节数组形式的那么通过语句的结果为for(byte b: bytes)System.out.print(b+"."); -34.24.12.-128.
(分析:在Java中byte类型的取值范围是-128〜127。如果返回的IP地址的某个字节是大于127的整数,在byte数组中就是负数。)
6. Java通过以下( )调用外部ping命令? Runtime.getRuntime().exec("ping -c 1 222.24.101.1")
(分析:JAVA执行外部命令主要通过调用平台的shell去完成。Runtime.getRuntime().exec() 克隆一个和当前虚拟机拥有相同环境变量的进程,再利用新进程去执行外部命令,最后推出新进程。频繁执行此命令,系统消耗大,CPU、内存负担很重)
7. 在JAVA语言中( )是给按钮组件增加一个按键监听 该按键是否被按下事件?button.addActionListener(new ActionListener());
(分析:JAVA中的Swing组件,按钮的重点是进行事件的监听,可以通过调用JButton的addActionListener()方法。这个方法接受一个实现ActionListener接口的对象作为参数,ActionListener接口中只包含一个actionPerformed()方法。)
8. ( )是申明Vector对象内元素为String类型的语句? Vector<String> rs = new Vector<String>();
(分析:上述创建一个动态数组的普通对象,这个对象数组里面的值都是string类型。)
9. 在Java中使用implement Runnable接口的类实例化对象后,以下哪项是正确的 class WorkLine implement Runnable{}
10。 在JAVA的网络编程中,需要引入以下哪个类库? java.io.* 和 java.net.*
--------------------------------------------
二. URL
1. URL类对象不可以执行POST操作
2. www.xupt.edu.cn是错误的URL地址
3. URL类的openStream()方法是创建一个 InputStream
4. 以下语句说明 Value = new String(Value.getBytes(“utf8”), “GBK”); 字符编码由utf8转为gbk
5. URLConnection类不是URL类的子类
6. URLConnection提供了对HTTP首部的访问
7. 当访问服务器页面成功时,返回代码 : 200
8. HttpClient支持https访问
9. 9 JEditPane属于 swing控件组
10. URLConnection类可以使用以下( )获得流?getInputStream(), openStream()
--------------------------------------------
三. IO
1. 以下()是NIO的三要素? Buffer, Channel, Selector
2. FileWriter是字符输出流
3. new RandomAccessFile(file, true) 表示不可以file尾部进行追加内容操作
4. Buffer属性中position表示 缓冲当前操作位置
5.
6. 用户向Buffer写数据方法是 put
7. 获得File的Channel方法是
FileInputStream f = new FileInputStream(filename);
FileChannel ch = f.getChannel();
8. StringTokenizer是利用(对象)形式拆分字符串
9. XML文件的第一行往往是 文件XML版本和编码申明
10. JSON文件中{ }表示 对象
--------------------------------------------
四. 综合
1. NIO中( )是Buffer的状态值: position,limit,capacity
2. ( )是SelectionKey的常量: OP_ACCEPT , OP_CONNECT, OP_READ ,OP_WRITE
3. 以下( )句正确SocketAddress sa = new InetSocketAddress("localhost", 8080);
InetAddress inet = InetAddress.getByName("localhost");
4. SelectableChannel中的 register方法用于: 注册监听事件
5. 在SocketChannel中设置非阻塞模式的方法是( ): socketChannel.configureBlocking(false);
6. Hashtable存储的是( 对象 )
7. Socket.getPort方法获得 本地端口号
8. new ServerSocket(8000)表示,8000端口的状态是 LISTENNING
9. Socket的由( IP,port )组成
10. http的默认端口是( 80 ),https的默认端口是( 443 )
--------------------------------------------
五. 测试一
假设你的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的字节数组形式)
我的答案
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();
}
}--------------------------------------------
六. 测试二
有以下学生信息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);
}
我的答案
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) 服务器端开启8080端口,并只接收1个客户端的连接
2) 服务器确认客户端连接后,发送“ welcome to my Server”字符串
3) 客户端收到欢迎信息后,发送 你的姓名和学号。我的答案
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);
}
}
}--------------------------------------------
八. 综合测试
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第一空:
java.nio.
new SAXReader()
read
getRootElement()
Element
raf.getChannel()
allocate
isEmpty
Element
clear
getBytes
flip
hasRemaining3
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