Socket用法详解

Socket用法详解
Socket用法详解

在客户/服务器通信模式中, 客户端需要主动创建与服务器连接的 Socket(套接字), 服务器端收到了客户端的连接请求, 也会创建与客户连接的 Socket. Socket可看做是通信连接两端的收发器, 服务器与客户端都通过 Socket 来收发数据.

这篇文章首先介绍Socket类的各个构造方法, 以及成员方法的用法, 接着介绍 Socket的一些选项的作用, 这些选项可控制客户建立与服务器的连接, 以及接收和发送数据的行为.

一. 构造Socket

Socket的构造方法有以下几种重载形式:

Socket()

Socket(InetAddress address, int port) throws UnknowHostException, IOException

Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException Socket(String host, int port) throws UnknowHostException, IOException

Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException

除了第一个不带参数的构造方法以外, 其他构造方法都会试图建立与服务器的连接, 如果连接成功, 就返回 Socket对象; 如果因为某些原因连接失败, 就会抛出IOException .

1.1 使用无参数构造方法, 设定等待建立连接的超时时间

Socket socket = new Socket();

SocketAddress remoteAddr = new InetSocketAddress("localhost",8000);

socket.connect(remoteAddr, 60000); //等待建立连接的超时时间为1分钟

以上代码用于连接到本地机器上的监听8000端口的服务器程序, 等待连接的最长时间为1分钟. 如果在1分钟内连接成功则connet()方法顺利返回; 如果在1分钟内出现某种异常, 则抛出该异常; 如果超过1分钟后, 即没有连接成功, 也没有出现其他异常, 那么会抛出 SocketTimeoutException. Socket 类的 connect(SocketAddress endpoint, int timeout) 方法负责连接服务器, 参数endpoint 指定服务器的地址, 参数timeout 设定超时数据, 以毫秒为单位. 如果参数timeout 设为0, 表示永远不会超时, 默认是不会超时的.

1.2 设定服务器的地址

除了第一个不带参数的构造方法, 其他构造方法都需要在参数中设定服务器的地址, 包括服务器的IP地址或主机名, 以及端口:

Socket(InetAddress address, int port) //第一个参数address 表示主机的IP地址

Socket(String host, int port) //第一个参数host 表示主机的名字

InetAddress 类表示服务器的IP地址, InetAddress 类提供了一系列静态工厂方法, 用于构造自身的实例, 例如:

//返回本地主机的IP地址

InetAddress addr1 = InetAddress.getLocalHost();

//返回代表 "222.34.5.7"的 IP地址

InetAddress addr2 = InetAddress.getByName("222.34.5.7");

//返回域名为"https://www.360docs.net/doc/1112702734.html,"的 IP地址

InetAddress addr3 = InetAddress.getByName("https://www.360docs.net/doc/1112702734.html,");

1.3 设定客户端的地址

在一个Socket 对象中, 即包含远程服务器的IP 地址和端口信息, 也包含本地客户端的IP 地址和端口信息. 默认情况下, 客户端的IP 地址来自于客户程序所在的主机, 客户端的端口则由操作系统随机分配. Socket类还有两个构造方法允许显式地设置客户端的IP 地址和端口:

//参数localAddr 和 localPort 用来设置客户端的IP 地址和端口

Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException

Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException

如果一个主机同时属于两个以上的网络, 它就可能拥有两个以上的IP 地址. 例如, 一个主机在Internet 网络中的IP 地址为 "222.67.1.34", 在一个局域网中的IP 地址为 "112.5.4.3". 假定这个主机上的客户程序希望和同一个局域网的一个服务器程序(地址为:"112.5.4.45: 8000")通信, 客户端可按照如下方式构造Socket 对象:

InetAddress remoteAddr1 = InetAddress.getByName("112.5.4.45");

InetAddress localAddr1 = InetAddress.getByName("112.5.4.3");

Socket socket1 = new Socket(remoteAddr1, 8000, localAddr1, 2345); //客户端使用端口2345

1.4 客户连接服务器时可能抛出的异常

当Socket 的构造方法请求连接服务器时, 可能会抛出下面的异常. UnKnownHostException: 如果无法识别主机的名字或IP 地址, 就会抛出这种异常.

ConnectException: 如果没有服务器进程监听指定的端口, 或者服务器进程拒绝连接, 就会抛出这种异常.

SocketTimeoutException: 如果等待连接超时, 就会抛出这种异常.

BindException: 如果无法把Socket 对象与指定的本地IP 地址或端口绑定, 就会抛出这种异常.

以上4中异常都是IOException的直接或间接子类. 如图2-1所示.

IOException------- UnknownHostException

|---- InterruptedIOException ----------- SocketTimeoutException

|---- SocketException ----------- BindException

|---------- ConnectException

图2-1 客户端连接服务器时可能抛出的异常

二. 获取Socket 的信息

在一个Socket 对象中同时包含了远程服务器的IP 地址和端口信息, 以及客户本地的IP 地址和端口信息. 此外, 从Socket 对象中还可以获得输出流和输入流, 分别用于向服务器发送数据, 以及接收从服务器端发来的数据. 以下方法用于获取Socket的有关信息.

getInetAddress(): 获得远程服务器的IP 地址.

getPort(): 获得远程服务器的端口.

getLocalAddress(): 获得客户本地的IP 地址.

getLocalPort(): 获得客户本地的端口.

getInputStream(): 获得输入流. 如果Socket 还没有连接, 或者已经关闭, 或者已经通过shutdownInput() 方法关闭输入流, 那么此方法会抛出IOException.

getOutputStream(): 获得输出流, 如果Socket 还没有连接, 或者已经关闭, 或者已经通过shutdownOutput() 方法关闭输出流, 那么此方法会抛出IOException.

这里有个HTTPClient 类的例子, 代码我是写好了, 也测试过了, 因为篇幅原因就不贴了. 这个HTTPClient 类用于访问网页 https://www.360docs.net/doc/1112702734.html,/index.jsp. 该网页位于一个主机名(也叫域名)为https://www.360docs.net/doc/1112702734.html, 的远程HTTP服务器上, 它监听 80 端口. 在HTTPClient 类中, 先创建了一个连接到该HTTP服务器的Socket对象, 然后发送符合HTTP 协议的请求, 接着接收从HTTP 服务器上发回的响应结果.

三. 关闭Socket

当客户与服务器的通信结束, 应该及时关闭Socket , 以释放Socket 占用的包括端口在内的各种资源. Socket 的 close() 方法负责关闭Socket. 当一个Socket对象被关闭, 就不能再通过它的输入流和输出流进行I/O操作, 否则会导致IOException.

为了确保关闭Socket 的操作总是被执行, 强烈建议把这个操作放在finally 代码块中:

Socket socket = null;

try{

socket = new Socket(https://www.360docs.net/doc/1112702734.html,,80);

//执行接收和发送数据的操作

..........

}catch(IOException e){

e.printStackTrace();

}finally{

try{

if(socket != null) socket.close();

}catch(IOException e){e.printStackTrace();}

}

Socket 类提供了3 个状态测试方法.

isClosed(): 如果Socket已经连接到远程主机, 并且还没有关闭, 则返回true , 否则返回false . isConnected(): 如果Socket曾经连接到远程主机, 则返回true , 否则返回false .

isBound(): 如果Socket已经与一个本地端口绑定, 则返回true , 否则返回false .

如果要判断一个Socket 对象当前是否处于连接状态, 可采用以下方式:

boolean isConnected = socket.isConnected() && !socket.isClosed();

四. 半关闭Socket

进程A 与进程B 通过Socket 通信, 假定进程A 输出数据, 进程B 读入数据. 进程A 如何告诉进程B 所有数据已经输出完毕? 下文略......

五. 设置Socket 的选项

Socket 有以下几个选项.

TCP_NODELAY: 表示立即发送数据.

SO_RESUSEADDR: 表示是否允许重用Socket 所绑定的本地地址.

SO_TIMEOUT: 表示接收数据时的等待超时数据.

SO_LINGER: 表示当执行Socket 的 close()方法时, 是否立即关闭底层的Socket.

SO_SNFBUF: 表示发送数据的缓冲区的大小.

SO_RCVBUF: 表示接收数据的缓冲区的大小.

SO_KEEPALIVE: 表示对于长时间处于空闲状态的Socket , 是否要自动把它关闭.

OOBINLINE: 表示是否支持发送一个字节的TCP 紧急数据.

5.1 TCP_NODELAY 选项

设置该选项: public void setTcpNoDelay(boolean on) throws SocketException

读取该选项: public boolean getTcpNoDelay() throws SocketException

默认情况下, 发送数据采用Negale 算法. Negale 算法是指发送方发送的数据不会立即发出, 而是先放在缓冲区, 等缓存区满了再发出. 发送完一批数据后, 会等待接收方对这批数据的回应, 然后再发送下一批数据. Negale 算法适用于发送方需要发送大批量数据, 并且接收方会及时作出回应的场合, 这种算法通过减少传输数据的次数来提高通信效率.

如果发送方持续地发送小批量的数据, 并且接收方不一定会立即发送响应数据, 那么Negale 算法会使发送方运行很慢. 对于GUI 程序, 如网络游戏程序(服务器需要实时跟踪客户端鼠标的移动), 这个问题尤其突出. 客户端鼠标位置改动的信息需要实时发送到服务器上, 由于Negale 算法采用缓冲, 大大减低了实时响应速度, 导致客户程序运行很慢.

TCP_NODELAY 的默认值为 false, 表示采用 Negale 算法. 如果调用setTcpNoDelay(true)方法, 就会关闭 Socket的缓冲, 确保数据及时发送:

if(!socket.getTcpNoDelay()) socket.setTcpNoDelay(true);

如果Socket 的底层实现不支持TCP_NODELAY 选项, 那么getTcpNoDelay() 和 setTcpNoDelay 方法会

抛出 SocketException.

5.2 SO_RESUSEADDR 选项

设置该选项: public void setResuseAddress(boolean on) throws SocketException

读取该选项: public boolean getResuseAddress() throws SocketException

当接收方通过Socket 的close() 方法关闭Socket 时, 如果网络上还有发送到这个Socket 的数据, 那

么底层的Socket 不会立即释放本地端口, 而是会等待一段时间, 确保接收到了网络上发送过来的延

迟数据, 然后再释放端口. Socket接收到延迟数据后, 不会对这些数据作任何处理. Socket 接收延迟

数据的目的是, 确保这些数据不会被其他碰巧绑定到同样端口的新进程接收到.

客户程序一般采用随机端口, 因此出现两个客户程序绑定到同样端口的可能性不大. 许多服务器程

序都使用固定的端口. 当服务器程序关闭后, 有可能它的端口还会被占用一段时间, 如果此时立刻在

同一个主机上重启服务器程序, 由于端口已经被占用, 使得服务器程序无法绑定到该端口, 启动失败. (第三篇文章会对此作出介绍).

为了确保一个进程关闭Socket 后, 即使它还没释放端口, 同一个主机上的其他进程还可以立即重用

该端口, 可以调用Socket 的setResuseAddress(true) 方法:

if(!socket.getResuseAddress()) socket.setResuseAddress(true);

值得注意的是 socket.setResuseAddress(true) 方法必须在 Socket 还没有绑定到一个本地端口之前调

用, 否则执行 socket.setResuseAddress(true) 方法无效. 因此必须按照以下方式创建Socket 对象, 然

后再连接远程服务器:

Socket socket = new Socket(); //此时Socket对象未绑定本地端口,并且未连接远程服务器

socket.setReuseAddress(true);

SocketAddress remoteAddr = new InetSocketAddress("localhost",8000);

socket.connect(remoteAddr); //连接远程服务器, 并且绑定匿名的本地端口

或者:

Socket socket = new Socket(); //此时Socke 对象为绑定本地端口, 并且未连接远程服务器 socket.setReuseAddress(true);

SocketAddress localAddr = new InetSocketAddress("localhost",9000);

SocketAddress remoteAddr = new InetSocketAddress("localhost",8000);

socket.bind(localAddr); //与本地端口绑定

socket.connect(remoteAddr); //连接远程服务器

此外, 两个共用同一个端口的进程必须都调用 socket.setResuseAddress(true) 方法, 才能使得一个进程关闭 Socket后, 另一个进程的 Socket 能够立即重用相同端口.

5.3 SO_TIMEOUT 选项

设置该选项: public void setSoTimeout(int milliseconds) throws SocketException

读取该选项: public int getSoTimeout() throws SocketException

当通过Socket 的输入流读数据时, 如果还没有数据, 就会等待. 例如, 在以下代码中, in.read(buff) 方法从输入流中读入 1024个字节:

byte[] buff = new byte[1024];

InputStream in = socket.getInputStream();

in.read(buff);

如果输入流中没有数据, in.read(buff) 就会等待发送方发送数据, 直到满足以下情况才结束等待:

略...............

Socket 类的 SO_TIMEOUT 选项用于设定接收数据的等待超时时间, 单位为毫秒, 它的默认值为 0, 表示会无限等待, 永远不会超时. 以下代码把接收数据的等待超时时间设为 3 分钟:

if(socket.getSoTimeout() == 0) socket.setSoTimeout(60000 * 3); //注意, 原书中这里的代码错误, 里面的方法名字都少了"So"

Socket 的 setSoTimeout() 方法必须在接收数据之前执行才有效. 此外, 当输入流的 read()方法抛出SocketTimeoutException 后, Socket 仍然是连接的, 可以尝试再次读数据:

socket.setSoTimeout(180000);

byte[] buff = new byte[1024];

InputStream in = socket.getInputStream();

int len = -1;

do{

try{

len = in.read(buff);

//处理读到的数据

//.........

}catch(SocketTimeoutException e){

//e.printStackTrace();

System.out.println("等待读超时!");

len = 0;

}

}while(len != -1);

例子ReceiveServer.java 和 SendClient.java 是一对简单的服务器/客户程序. sendClient 发送字符串"hello everyone" ,接着睡眠 1 分钟, 然后关闭 Socket. ReceiveServer 读取 SendClient 发送来的数据, 直到抵达输入流的末尾, 最后打印 SendClient 发送来的数据.

ReceiveServer.java 略....... , SendClient.java 略..........

在 SendClient 发送字符串 "hello everyone" 后, 睡眠 1 分钟. 当 SendClient 在睡眠时, ReceiveServer 在执行 in.read(buff) 方法, 不能读到足够的数据填满 buff 缓冲区, 因此会一直等待 SendClient 发送数据. 如果在 ReceiveServer 类中 socket.setSoTimeout(20000) , 从而把等待接收数据的超时时间设为 20 秒, 那么 ReceiveServer 在等待数据时, 每当超过 20 秒, 就会抛出SocketTimeoutException . 等到SendClient 睡眠 1 分钟后, SendClient 调用 Socket 的 close() 方法关闭 Socket, 这意味着 ReceiveServer 读到了输入流的末尾, ReceiveServer 立即结束读等待, read() 方法返回 -1 . ReceiveServer最后打印接收到的字符串 "hello everyone", 结果如下:

等待读超时!

等待读超时!

hello everyone

5.4 SO_LINGER 选项

设置该选项: public void setSoLinger(boolean on, int seconds) throws SocketException

读取该选项: public int getSoLinger() throws SocketException

SO_LINGER 选项用来控制 Socket 关闭时的行为. 默认情况下, 执行 Socket 的 close() 方法, 该方法会立即返回, 但底层的 Socket 实际上并不立即关闭, 它会延迟一段时间, 直到发送完所有剩余的数据, 才会真正关闭 Socket, 断开连接.

如果执行以下方法:

socket.setSoLinger(true, 0);

那么执行Socket 的close() 方法, 该方法也会立即返回, 并且底层的 Socket 也会立即关闭, 所有未发送完的剩余数据被丢弃.

如果执行以下方法:

socket.setSoLinger(true, 3600);

那么执行Socket 的 close() 方法, 该方法不会立即返回, 而是进入阻塞状态. 同时, 底层的 Socket 会尝试发送剩余的数据. 只有满足以下两个条件之一, close() 方法才返回:

⑴底层的 Socket 已经发送完所有的剩余数据;

⑵尽管底层的 Socket 还没有发送完所有的剩余数据, 但已经阻塞了 3600 秒(注意这里是秒, 而非毫秒), close() 方法的阻塞时间超过 3600 秒, 也会返回, 剩余未发送的数据被丢弃.

值得注意的是, 在以上两种情况内, 当close() 方法返回后, 底层的 Socket 会被关闭, 断开连接. 此外, setSoLinger(boolean on, int seconds) 方法中的 seconds 参数以秒为单位, 而不是以毫秒为单位.

如果未设置 SO_LINGER 选项, getSoLinger() 返回的结果是 -1, 如果设置了 socket.setSoLinger(true, 80) , getSoLinger() 返回的结果是 80.

Tips: 当程序通过输出流写数据时, 仅仅表示程序向网络提交了一批数据, 由网络负责输送到接收方. 当程序关闭 Socket, 有可能这批数据还在网络上传输, 还未到达接收方. 这里所说的 "未发送完的数据" 就是指这种还在网络上传输, 未被接收方接收的数据.

例子 SimpleClient.java 与 SimpleServer.java 所示是一对简单的客户/服务器程序. SimpleClient 类发送一万个字符给 SimpleServer, 然后调用Socket 的 close() 方法关闭 Socket.

SimpleServer 通过 ServerSocket 的 accept() 方法接受了 SimpleClient 的连接请求后, 并不立即接收客户发送的数据, 而是睡眠 5 秒钟后再接收数据. 等到 SimpleServer 开始接收数据时, SimpleClient 有可能已经执行了 Socket 的close() 方法, 那么 SimpleServer 还能接收到 SimpleClient 发送的数据吗?

SimpleClient.java 略..., SimpleServer.java 略......

SimpleClient.java中

System.out.println("开始关闭 Socket");

long begin = System.currentTimeMillis();

socket.close();

long end = System.currentTimeMillis();

System.out.println("关闭Socket 所用的时间为:" + (end - begin) + "ms");

下面分 3 种情况演示 SimpleClient 关闭 Socket 的行为.

⑴未设置 SO_LINGER 选项, 当 SimpleClient 执行 Socket 的close() 方法时, 立即返回, SimpleClient 的打印结果如下:

开始关闭 Socket

关闭Socket 所用的时间为:0ms

等到 SimpleClient 结束运行, SimpleServer 可能才刚刚结束睡眠, 开始接收 SimpleClient 发送的数据. 此时尽管 SimpleClient 已经执行了 Socket 的 close() 方法, 并且 SimpleClient 程序本身也运行结束了, 但从 SimpleServer 的打印结果可以看出, SimpleServer 仍然接收到了所有的数据. 之所以出现这种情况, 是因为当 SimpleClient 执行了 Socket 的 close() 方法后, 底层的 Socket 实际上并没有真正关闭, 与SimpleServer 的连接依然存在. 底层的 Socket 会存在一段时间, 直到发送完所有的数据.

⑵设置SO_LINGER 选项, socket.setSoLinger(true, 0). 这次当 SimpleClient 执行 Socket 的 close() 方法时, 会强行关闭底层的 Socket, 所有未发送完的数据丢失. SimpleClient 的打印结果如下:

开始关闭 Socket

关闭Socket 所用的时间为:0ms

从打印结果看出, SimpleClient 执行 Socket 的 close() 方法时, 也立即返回. 当 SimpleServer 结束睡眠, 开始接收 SimpleClient 发送的数据时, 由于 SimpleClient 已经关闭底层 Socket, 断开连接, 因此SimpleServer 在读数据时会抛出 SocketException:

https://www.360docs.net/doc/1112702734.html,.SocketException: Connection reset

⑶设置SO_LINGER 选项, socket.setSoLinger(true, 3600). 这次当 SimpleClient 执行 Socket 的close() 方法时, 会进入阻塞状态, 知道等待了 3600 秒, 或者底层 Socket 已经把所有未发送的剩余数据发送完毕, 才会从 close() 方法返回. SimpleClient 的打印结果如下:

开始关闭 Socket

关闭Socket 所用的时间为:5648ms

当 SimpleServer 结束了 5 秒钟的睡眠, 开始接收 SimpleClient 发送的数据时, SimpleClient 还在这些Socket 的close() 方法, 并且处于阻塞状态. SimpleClient 与 SimpleServer 之间的连接依然存在, 因此SimpleServer 能够接收到 SimpleClient 发送的所有数据.

5.5 SO_RCVBUF 选项

设置该选项: public void setReceiveBufferSize(int size) throws SocketException

读取该选项: public int getReceiveBufferSize() throws SocketException

SO_RCVBUF 表示 Socket 的用于输入数据的缓冲区的大小. 一般说来, 传输大的连续的数据块(基于HTTP 或 FTP 协议的通信) 可以使用较大的缓冲区, 这可以减少传输数据的次数, 提高传输数据的效率. 而对于交互频繁且单次传送数据量比较小的通信方式(Telnet 和网络游戏), 则应该采用小的缓冲区, 确保小批量的数据能及时发送给对方. 这种设定缓冲区大小的原则也同样适用于 Socket 的SO_SNDBUF 选项.

如果底层 Socket 不支持 SO_RCVBUF 选项, 那么 setReceiveBufferSize() 方法会抛出 SocketException.

5.6 SO_SNDBUF 选项

设置该选项: public void setSendBufferSize(int size) throws SocketException

读取该选项: public int getSendBufferSize() throws SocketException

SO_SNDBUF 表示 Socket 的用于输出数据的缓冲区的大小. 如果底层 Socket 不支持 SO_SNDBUF 选项, setSendBufferSize() 方法会抛出 SocketException.

5.7 SO_KEEPALIVE 选项

设置该选项: public void setKeepAlive(boolean on) throws SocketException

读取该选项: public boolean getKeepAlive() throws SocketException //原书中这个方法返回的类型是int

当 SO_KEEPALIVE 选项为 true 时, 表示底层的TCP 实现会监视该连接是否有效. 当连接处于空闲状态(连接的两端没有互相传送数据) 超过了 2 小时时, 本地的TCP 实现会发送一个数据包给远程的Socket. 如果远程Socket 没有发回响应, TCP实现就会持续尝试 11 分钟, 直到接收到响应为止. 如果在 12 分钟内未收到响应, TCP 实现就会自动关闭本地Socket, 断开连接. 在不同的网络平台上, TCP

实现尝试与远程Socket 对话的时限有所差别.

SO_KEEPALIVE 选项的默认值为 false, 表示TCP 不会监视连接是否有效, 不活动的客户端可能会

永远存在下去, 而不会注意到服务器已经崩溃.

以下代码把 SO_KEEPALIVE 选项设为 true:

if(!socket.getKeepAlive()) socket.setKeepAlive(true);

5.8 OOBINLINE 选项

设置该选项: public void setOOBInline(boolean on) throws SocketException

读取该选项: public boolean getOOBInline() throws SocketException //原书中这个方法返回的类型是int

当 OOBINLINE 为 true 时, 表示支持发送一个字节的 TCP 紧急数据. Socket 类的 sendUrgentData(int data) 方法用于发送一个字节的 TCP紧急数据.

OOBINLINE 的默认值为 false, 在这种情况下, 当接收方收到紧急数据时不作任何处理, 直接将其丢弃. 如果用户希望发送紧急数据, 应该把 OOBINLINE 设为 true:

socket.setOOBInline(true);

此时接收方会把接收到的紧急数据与普通数据放在同样的队列中. 值得注意的是, 除非使用一些更高层次的协议, 否则接收方处理紧急数据的能力有限, 当紧急数据到来时, 接收方不会得到任何通知, 因此接收方很难区分普通数据与紧急数据, 只好按照同样的方式处理它们.

5.9 服务类型选项

当用户通过邮局发送普通信、挂号信或快件时, 实际上是选择了邮局提供的不同的服务. 发送普通信的价格最低, 但发送速度慢, 并且可靠性没有保证. 发送挂号信的价格稍高, 但可靠性有保证. 发送快件的价格最高, 发送速度最快, 并且可靠性有保证.

在 Internet 上传输数据也分为不同的服务类型, 它们有不同的定价. 用户可以根据自己的需求, 选择不同的服务类型. 例如, 发送视频需要较高的带宽, 快速到达目的地, 以保证接收方看到连续的画面. 而发送电子邮件可以使用较低的带宽, 延迟几个小时到达目的地也没有关系.

IP 规定了 4 种服务类型, 用来定性地描述服务的质量.

低成本: 发送成本低.

高可靠性: 保证把数据可靠地送达目的地.

最高吞吐量: 一次可以接收或发送大批量的数据.

最小延迟: 传输数据的速度快, 把数据快速送达目的地.

这 4 种服务类型还可以进行组合. 例如, 可以同时要求获得高可靠性和最小延迟.

Socket 类中提供了设置和读取服务类型的方法.

设置服务类型: public void setTrafficClass(int trafficClass) throws SocketException

读取服务类型: public int getTrafficClass() throws SocketException

Socket 类用 4 个整数表示服务类型.

低成本: 0x02 (二进制的倒数第二位为1)

高可靠性: 0x04 (二进制的倒数第三位为1)

最高吞吐量: 0x08 (二进制的倒数第四位为1)

最小延迟: 0x10 (二进制的倒数第五位为1)

例如, 以下代码请求高可靠性传输服务:

socket = new Socket(host, port);

socket.setTrafficClass(0x04);

再例如, 以下代码请求高可靠性和最小延迟传输服务:

socket.setTrafficClass(0x04|0x10); //把 0x04 与 0x10 进行位或运算

5.10 设定连接时间、延迟和带宽的相对重要性

在 JDK 1.5 中, 还为 Socket 类提供了一个 setPerformancePreferences() 方法:

public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) 以上方法的 3 个参数表示网络传输数据的 3 选指标.

参数 connectionTime: 表示用最少时间建立连接.

参数 latency: 表示最小延迟.

参数 bandwidth: 表示最高带宽.

setPerformancePreferences() 方法用来设定这 3 项指标之间的相对重要性. 可以为这些参数赋予任意的整数, 这些整数之间的相对大小就决定了相应参数的相对重要性.

例如, 如果参数 connectionTime 为 2, 参数 latency 为 1, 而参数bandwidth 为 3, 就表示最高带宽最重要, 其次是最少连接时间, 最后是最小延迟.

should 用法讲与

should 用法讲与练 should 一词在中学英语课本中出现频率很高。它的用法灵活、含义丰富,因而一直是历年中考关注的热点。现将其具体用法分述如下: 一 . should 作为助动词shall 的过去式,可以在间接引语中与第一人称主语搭配,表示过去将来时间。例如: The group leader announced that we should (= would )begin to work soon. 小组长宣布:我们不久就开始工作。 A week ago,I told him that I should (= would)go to Beijing the next day. 一个星期以前,我告诉他我第二天就去北京。 二 . should 作为情态动词,通常用来表示现在或将来的责任或义务,译作“应该”、“应当”,这时它可以和ought to,be supposed to 互换使用。例如: You should (= are supposed to )complete your test in time. 你们应该按时做完你们的实验。 You should (= ought to )tell your mother about it at once. 你应该立即把此事告诉你妈妈。 In sum,theory should be combined with practice. 总之,理论应该与实验相结合。 三 . should 作为情态动词,可以用在条件状语从句中,表示语气较强的假设,译作“万一”、“竟然”,这时也可将should 置于从句之首,即将should 放在主语前面,而省略从属连词if .例如: If you should fail to come,ask Mrs Chen to work in your place. (= Should you fail to come,ask Mrs Chen to work in your place. )万一你来不了,就叫陈夫人代替你。 If anyone should come,say I am not at home. (= Should anyone come,say I am not at home. )万一有人来访,就说我不在家。 If it should rain tomorrow,I wouldn't go. (= Should it rain tomorrow,I wouldn't go.) 万一明天天下雨,我就不去了。 四 . should 作为情态动词,可以表示谦逊、客气、委婉之意,译为“可……”、“倒……”。

名词性从句用法详解

高一语法专题:名词性从句 在句子中起名词作用的从句叫名词性从句。名词性从句的功能相当于名词词组,它在 复合句中能担任主语、宾语、表语、同位语,因此根据它在句中不同的语法功能,名词性 从句又可分为主语从句、宾语从句、表语从句、同位语从句。 引导名词性从句的词叫做连接词,包括:1. 连词(在名词性从句中只起连接作用,不 作成分) 2. 连接代词(在名词性从句中作主语、宾语 或表语) 3. 连接副词(在名词性从句中作状语) I 主语从句:是在主句中作主语的从句。它由连接词引导,通常位于谓语动词之前。 连接词:

1. 连词:在从句中不充当任何成分,常见的引导主语从句的连词有that, whether。 That he got the first prize excited him much. 他获得一等奖一事使他非常兴奋。 It is doubtful whether we can get there on time. 我们能否按时到达那儿还不确定。 1)that引导的主语从句:在从句中不作任何成分,也没有实际意义。一般情况 下that不可省略。 That light travels in straight lines is known to all. 众所周知,光沿直线传播。 That you don't like him is none of my business. 你不喜欢他不关我的事。 2)whether引导的主语从句:常置于句首,表示“是否”之意;

Whether he can finish his task on time is of great importance. 他是否能按时完成任务非常重要。 Whether you can succeed or not depends on how hard you work at it. 你能否成功取决于你努力的程度。 2.连接代词:在从句中起名词或代词的作用,常作从句的主语、宾语、表语或定语,有具 体意义且不能省略。常见的连接代词有who, whom, whose, what, which, whoever, whomever, whatever, whichever。 What we should do with the problem is undecided. 我们如何处理这个问题还未作出决定。(what引导主语从句,不表疑问意义) Whom the letter was from is still unknown.

高三英语As引起的短语详解和“should”用法归纳

As 引起的短语详解和“should”用法归纳 As引起的短语在英语中有很重要的地位,在NMET中出现的频率很高,是要求重点掌握的内容。 1. As a matter of fact事实上,其实 As a matter of fact, I know nothing about the constructions of the information p 其实我对这些信息产品的构造一无所知。 2. As a result结果,终于,因此 She studied hard. As a result, she made fast progress in the studies. 她学习用功。因此她在学习方面进步很快。 3. As a result(或consequence)of… 作为……结果,由于……结果 As a result of its rise in temperature the gas expands.由于温度上升,气体就膨胀。 4. as a rule作为一个常规,通常,习以为常 As a rule, we keep records on all the experiments so that we may have enough dat a.我们通常总是对所有的实验都作记录,以便得到足够的资料。 5. As a whole作为一个整体(来看) We should analyze the problem as a whole.我们应该把这个问题作为一个整体来分析。(状 语) 6. As above如上 这件事已在上面解释过了。 7. as…as ever像往常一样…… She works as hard as ever.她工作一贯努力。 8. as…as possible尽可能地…… as soon as possible尽可能早 as big as possible尽可能大,越大越好 as carefully as possible越仔细越好 as far as possible尽可能,尽力

情态动词should的用法

情态动词should的用法 情态动词should和can ,may ,must一样,没有人称和数的变化,有词意,但都不能单独作谓语,必须和后面的动词原形一起构成谓语。基本意思是“应当,应该”,常用来表示建议或命令等。如: You should work harder. 你应该更努力地工作。 否定式和疑问式的构成与can ,may ,must一样。如: You shouldn’t play soccer in the street.你们不应该在街上踢足球。 Who should pay the taxi driver? 谁应该付出租车钱? 注意: 常用句型You should /shouldn’t do sth 表示“建议某人(不)做某事”。其他表示“建议”的句型还有:Why not do sth? /Why don’t you do sth? /How about doing sth? /What about doing sth? /It’s a good idea to do sth /You’d better do sth等。 should作为情态动词用,常常表示意外、惊奇、不能理解等,有“竟会”的意思,例如: How should I know? 我怎么知道? Why should you be so late today? 你今天为什么来得这么晚? should有时表示应当做或发生的事,例如: We should help each other.我们应当互相帮助。 我们在使用时要注意以下几点: 1. 用于表示“应该”或“不应该”的概念。此时常指长辈教导或责备晚辈。例如: You should be here with clean hands. 你应该把手洗干净了再来。 2. 用于提出意见劝导别人。例如: You should go to the doctor if you feel ill. 如果你感觉不舒服,你最好去看医生。 3. 用于表示可能性。should的这一用法是考试中常常出现的考点之一。例如: We should arrive by supper time. 我们在晚饭前就能到了。 She should be here any moment. 她随时都可能来。 1. We _________ keep the new traffic law(交通法). A. may B. should C. can D. need 2.I’d like to buy a new shirt , but I don’t know __________ . A. where could buy it B. I should take which C. which I should take D. where can I get it 写出同义表达 Why not have a rest? (1) Why _______ ________ have a rest? (2) You’d _________ _________ a rest. (3) You _______ ________ a rest. (4) ________ _________ having a rest?

英语中should的用法归纳

英语中should的用法归纳 一、Should 表示过去将来时,即从过去观点看将来要发生的是,多用于间接引语中。 We thought that we should never see you again. 我们想我们再也看不到你了。 The BBC weather report this morning said that we should have rain.今天早上,BBC电台天气报告说,今天有雨。 二、Should 表示义务、责任、常译为“应当”,“应该”,或表示一种估计的情况,译成“按理应当”,“估计......”。 Why should I pay him?为什么我该付给他钱? They should be there by now,I think. 我估计,他们现在到那儿了。 Should 用于完成时态,表示对过去发生的动作的一种推测,译成“应该已经......”。

You should have washed the wood. (But you haven't.)你应该把伤口清洗了。(然而你没有) 三、Should 用于虚拟语气中。 (1)用于It is necessary (important,strange.。。that.。。)中,在美国英语中should 常省去。 It is important that we (should)learn English well. 我们学好英语很重要。 (2)用于It is ordered (suggested)that.。。中,而在美语中should常省去。 It is decided that we (should)finish our work in a week.决定我们要在一周之内完成我们的工作。 (3)用于表示命令、请求、建议、决定等词后面的宾语从句中,在美国英语中should常省去。 He wrote,suggesting that Mr. Wang (should)come to Beijing. 他信中建议王先生到北京来。 The commander ordered that the city (should)be taken in five days.司令员下令必须在五天之内占领这座城市。 (4)should用于表示命令、请求、建议、决定等词后面的表语从句,同位语从句中,在美国英语中should 常省去。

(完整word版)中考复习名词用法讲解.doc

语法总复习 名词 一、考纲解读 明确考点在历年中考中所占分数比例是提高学习效率的首要条件,要做到心中有数! 二、学习与应用 我们知道,构成句子的两个主要成分是主语和谓语,谓语由动词或者动词短语来充当, 而主语则主要是由咱们名词或者名词短语来构成。由此可见名词多么重要!那还等什么 呢?快快进入咱们名词世界畅游吧! 常考点知识清单 名词的分类 名词分为专有名词和普通名词两大类,普通名词又分为可数名词和 1.可数名词: ________ 两类。 有单数和复数之分,表示一个或者多少。单数名词表泛指,在前面加 冠词后得单词以_____ 音素开头时前用an,反之用 a 。例如 an -s/-es 。例如: books/classes。 可数名词复数的变化形式 a.规则变化ugly a/an. 例如 a man/an old man。当不定 man/a useful book 。复数形式通常加

【巧学妙记】 1 .以 -o 结尾,复数加 -es 的,初中阶段主要有以下几个单词: Negro 黑人 hero 英雄 potato 马铃薯 tomato 西红柿 Negroes and heroes like to eat potatoes and tomatoes. 黑人和英雄喜欢吃马铃薯和西红柿 2 .以 -f 或 -fe 结尾的名词变复数改成-v 加 -es,初中阶段主要有以下几个单词: Leaf 树叶half 一半self 自己wife 妻子knife 刀子shelf 架子wolf 狼thief 小偷life 生命树叶半数自己黄,妻子操刀去割粮 架后窜出一只狼,就像小偷逃命亡 3 .以 -f 或 -fe 结尾的名词变复数时,只加-s 的,初中阶段主要有以下几个单词: gulf 海湾, roof 屋顶, chief 首领, serf 农奴, belief 信仰, proof 证据, handkerchief手帕。可以记为:海湾边,屋顶上,首领农奴两相望 谁说他们无信仰,证据写在手帕上 b.不规则变化

should用法归纳

s h o u l d用法归纳一、Should 表示过去将来时,即从过去观点看将来要发生的是,多用于间接引语中。 We thought that we should never see you again. 我们想我们再也看不到你了。 The BBC weather report this morning said that we should have rain.今天早上,BBC电台天气报告说,今天有雨。 二、Should 表示义务、责任、常译为“应当”,“应该”,或表示一种估计的情况,译成“按理应当”,“估计......”。 Why should I pay him? 为什么我该付给他钱? They should be there by now,I think. 我估计,他们现在到那儿了。 Should 用于完成时态,表示对过去发生的动作的一种推测,译成“应该已经......”。 You should have washed the wood. (But you haven‘t.) 你应该把伤口清洗了。(然而你没有) 三、Should 用于虚拟语气中。 (1)用于It is necessary (important,strange.。。that.。。)中,在美国英语中should 常省去。 It is important that we (should) learn English well. 我们学好英语很重要。 (2)用于It is ordered (suggested)that.。。中,而在美语中should常省去。 It is decided that we (should) finish our work in a week.决定我们要在一周之内完成我们的工作。 (3)用于表示命令、请求、建议、决定等词后面的宾语从句中,在美国英语中should常省去。 He wrote,suggesting that Mr. Wang (should) come to Beijing. 他信中建议王先生到北京来。 The commander ordered that the city (should) be taken in five days.司令员下令必须在五天之内占领这座城市。 (4)should用于表示命令、请求、建议、决定等词后面的表语从句,同位语从句中,在美国英语中should 常省去。 We all agreed to his suggestion that we (should) go to Beijing for sightseeing.我们都同意他的意见,去北京观光。

重点高中英语:名词作定语的用法讲解

重点高中英语:名词作定语的用法讲解

————————————————————————————————作者:————————————————————————————————日期:

高中英语:名词作定语的用法讲解 作定语的名词往往是说明其中名词的材料、用途、时间、地点、内容、类别等。 下面是是名词作定语的用法讲解,大家可以参考学习。 一、名词作定语的基本原则 名词作定语原则上用单数,不用复数。如: a stone bridge 石桥(不能说a stones bridge) a meeting room 会议室(不能说a meetings room) morning exercise 早操(不能说a mornings exercise) a story book 故事书(不能说a stories book) a coffee cup 咖啡杯(不能说a coffees cup) a baby girl 女婴(不能说a babies girl) a school gate 校门(不能说a schools gate) eye drops眼药水(不能说eyes drops) test paper考卷(不能说tests paper) book report读书报告(不能说books report) train station火车站(不能说trains station) plane ticket机票(不能说plane tickets) pocket money零花钱(不能说pockets money) generation gap代沟(不能说generations gap) 二、用复数名词作定语的四种情形: 1. 有些只有复数形式的名词,则用复数作定语:

最新shall和should的用法

1. shall在疑问句中的用法。在疑问句中用于征求对方意见,主要用于第一人称(在英国英语中,也用于第三人称),其意为“要不要”、“…好吗”:Shall I get you a chair for you? 要不要我给你拿把椅子来?What shall we do this evening? 我们今天晚上做什么呢?Shall the boy come at once? 要不要这孩子马上来? 2. shall在陈述句中的用法。在陈述句表示说话者的允诺、告诫、威胁、命令、规定、必然性等,主要用于第二、三人称:You shall suffer for this. 你会为此事吃苦头的。(表威胁)That day shall come.那一天一定会来。That day shall come(表必然性)Tell him that he shall have the book tomorrow. 告诉他这本书明天给他。(表允诺)Persons under 18 shall not be employed in night work.不满十八岁的人不得雇佣干夜间工作。(表规定)【注】有时用于第一人称,表示决心:【注】有时用于第一人称I shall return. 我一定回来。(表示决心) 。 3. should表示义务或责任。其意为““”:We should learn from each other. 我们应该互相帮助。We should help the aged. 我们应该帮助老人。You should pay your debts. 你应该还债。You should pay your debts. 4. should 表示建议或劝告。其意为“应该”:You should give up smoking. 你应该戒烟。You should go and ask your teacher. 你应该去问问老师。【注】有时语气较强,含有命令的意味:You should leave at

SHALL和SHOULD的用法

Shall和should的用法 1. shall在疑问句中的用法。在疑问句中用于征求对方意见,主要用于第一人称(在英国英语中,也用于第三人称),其意为要不要、好吗:Shall I get you a chair for you? 要不要我给你拿把椅子来?What shall we do this evening? 我们今天晚上做什么呢?Shall the boy come at once? 要不要这孩子马上来? 2. shall在陈述句中的用法。在陈述句表示说话者的允诺、告诫、威胁、命令、规定、必然性等,主要用于第二、三人称:You shall suffer for this. 你会为此事吃苦头的。(表威胁)That day shall come.那一天一定会来。That day shall come(表必然性)Tell him that he shall have the book tomorrow. 告诉他这本书明天给他。(表允诺)Persons under 18 shall not be employed in night work.不满十八岁的人不得雇佣干夜间工作。(表规定)【注】有时用于第一人称,表示决心:【注】有时用于第一人称 I shall return. 我一定回来。(表示决心) 。 3. should表示义务或责任。其意为:We should learn from each other. 我们应该互相帮助。We should help the aged. 我们应该帮助老人。You should pay your debts. 你应该还债。You should pay your debts. 4. should 表示建议或劝告。其意为应该:You should give up smoking. 你应该戒烟。You should go and ask your teacher. 你应该去问问老师。【注】有时语气较强,含有命令的意味:You should leave at once. 你应该马上离开。 5. should 表示推断。表示推断。意为应该、可能:They should be there by now, I think. 我想现在他们都已经到了。The concert should be great fun. 音乐会应该很有意思。The poems should be out in a month or so. 个把月之后这些诗估计就可以出版了。With an early start he should be here by noon. 动身得早,他中午就该到这里了。 【注】should表示推断时,语气较肯定,通常是指非常可能的事(因为暗示有一定的事实依据或合乎常理),而may, might, could等表示推测时,则语气较不肯定,尤其是might, could。 请看一道考题: When can I come for the photos? I need them tomorrow afternoon. They _____ be ready by 12:00. A. can B. should C. might D. need ;B和C虽均可用于肯定句表示推测,但根据对话情景顾客下午要照片,如果店主中午12点还不能把照片冲洗出来,那么生意肯定难做成,所以店主应用肯定语气较强的12should(=应该)来回答顾客,而不是用语气较弱的 might(=有可能),即应选B不选C。 6. should 用于征求意见。主要用于第一人称的疑问句形式:Should I open the window? 我可以打开窗户吗?Where should I meet you tonight? 我今晚该到哪儿与你见面?What

中考英语复习-名词的用法(知识讲解)

名词的用法 【真题再现】 1. —It’s said that a college student had a ______ to Tibet with 500 yuan for a month. — How surprising! Once you have an idea to go somewhere, do it! (2014山西) A. match B. travel C. change 2. — I am just going to the ______. Do you want anything? — Yes, a bag of rice.(2014 沈阳) A. market B. classroom C. library D. park 3. — Nobody knows which team will win the 2014 World Cup in Brazil.(2014连云港) — Yes. That is the ______ of the beautiful game. A. question B. luck C. hope D. magic 4. Mum, it’s so hot. Could I have some ______?(2014黑龙江龙东地区) A. hamburgers B. bread C. ice-cream 5. Miss Black is a friend of ______, she always looks after my sister. (2014黑龙江龙东地区) A. Mar y’s mother’s B. Mary’s mother’ C. Mary mother’s 6. Wang Yaping and Liu Yang are our ______ in China. We’re proud ______ them. (2014黑龙江龙东地区) A. women astronauts; of B. woman astronauts; of C. women astronauts; in 7. My teacher gave me much ________ on how to study English well when I had some trouble.( 2014菏泽) A. advice B. question C. suggestion D. problem 8. US First Lady Michelle Obama encouraged students to study abroad in her ________ when visiting Peking University on March 22, 2014. (2014镇江) A. story B. speech C. letter D. diary 9. There are some _______ in Dayton Art Museum. For example, no food or drinks is allowed inside.(2014温州) A. jobs B. records C. rules D. paintings 10.Mickey mouse is one of the most famous _______ in American _______.(2015广东) A.symbol,culture B. symbol,cultures C.symbols,culture D. symbols,cultures 11. In 1998, Liu Xiang’s ______ in hurdling was noticed by Sun Jiangping. (2015天津) A. ability B. trade C. electricity D. memory 12. Yesterday Lucy told us such good that we are all amazed at it. (2015青岛) A. news B. ideas C. suggestion D. answer 13.Health is important for us teenagers, so we should eat more vegetables such as ________ to keep healthy. (2015哈尔滨) A.tomatoes and potatoes B.tomatos and potatos C.tomatos and potatoes 14. She says her favorite ________ is English. (2015成都) A.color B.sport C.subject 15. Annie has a ________, and she is going to see her dentist today.(2015温州) A. cold B. fever C. cough D. toothache 16. Jeff will come t o understand you one day. It’s a matter of ________ . (2015厦门) A. pleasure B. value C. time 17.Maori people in New Zealand touch _______ when they meet.(2015南宁)

初中英语名词用法讲解

一、名词的分类 名词可分为普通名词和专有名词两大类。 1. 普通名词又可分为: (1)个体名词。如:cup,desk,student等。一般可数,有单复数形式。 (2)集体名词。如:class,team,family等。一般可数,有单复数形式。 (3)物质名词。如:rice,water,cotton等。一般不可数,没有单复数之分。 (4)抽象名词。如:love,work,life等。一般不可数,没有单复数之分。 2. 专有名词:如:China,Newton,London等。 二、名词的数 (一)可数名词的复数形式的构成规则 1. 一般情况下在名词的词尾加s,如:book books,pencil pencils. 2. 以-s,-x,-ch,-sh结尾的名词加-es,其读音为[iz]。如:bus buses,box boxes,watch watches,dish dishes等。 3. 以-y结尾的名词: (1)以“辅音字母+y”结尾的名词,把y改为i再加es,读音为[iz],如:factory factories,company companies等。 (2)以“元音字母+y”结尾的名词,或专有名词以y结尾,直接在词尾加-s,读音为[z]。如:key keys,Henry Henrys等。 4. 以-f和-fe结尾的名词: (1)变-f或-fe为v再加-es,读音为[vz]。如:thief thieves,wife wives,half halves等。 (2)直接在词尾加-s,如:roof roofs,gulf gulfs,chief chiefs,proof proofs等。 (3)两者均可。如:handkerchief handkerchiefs或handkerchieves. 5. 以-o结尾的名词:

should用法详解

should一词在英语中出现频率很高。它的用法灵活、含义丰富,因而一直是历年各类考试关注的热点。现将其具体用法分述如下: 一 . should 作为助动词shall 的过去式,可以在间接引语中与第一人称主语搭配,表示过去将来时间。例如: The group leader announced that we should (= would )begin to work soon. 小组长宣布:我们不久就开始工作。 A week ago,I told him that I should (= would)go to Beijing the next day. 一个星期以前,我告诉他我第二天就去北京。 二 . should 作为情态动词,通常用来表示现在或将来的责任或义务,译作“应该”、“应当”,这时它可以和ought to,be supposed to 互换使用。例如: You should (= are supposed to )complete your test in time. 你们应该按时做完你们的实验。 You should (= ought to )tell your mother about it at once. 你应该立即把此事告诉你妈妈。 In sum,theory should be combined with practice. 总之,理论应该与实验相结合。 三 . should 作为情态动词,可以用在条件状语从句中,表示语气较强的假设,译作“万一”、“竟然”,这时也可将should 置于从句之首,即将should 放在主语前面,而省略从属连词if .例如: If you should fail to come,ask Mrs Chen to work in your place. (= Should you fail to come,ask Mrs Chen to work in your place. )万一你来不了,就叫陈夫人代替你。 If anyone should come,say I am not at home. (= Should anyone come,say I am not at home. )万一有人来访,就说我不在家。 If it should rain tomorrow,I wouldn't go. (= Should it rain tomorrow,I wouldn't go.) 万一明天天下雨,我就不去了。

英语名词用法总结(完整)

英语名词用法总结(完整) 一、单项选择名词 1.‘’There is among Chinese people that no country or individual can can protect itself without intellectual property(知识产权)protection’’ Liu Xin said. A.commitment B.criterion C.consensus D.competence 【答案】C 【解析】 【详解】 考查名词词义辨析。句意:刘鑫说,在中国人群中由这样一种共识,没有知识产权保护法的话,任何国家和个人都不能保护自己。https://www.360docs.net/doc/1112702734.html,mitment 承诺、许诺,(因工作而)献身、奉献B. criterion (判断的)标准、准则、原则;C.consensus 一致意见、共识;D. competence 能力、胜任、本领。根据句意判断,故选C。 2.场景、场面 ( 着重人物的活动) 3.His conflicted with that of the other witnesses and yet his story had, for me, the ring of truth. A.expectation B.instruction C.response D.account 【答案】D 【解析】 【详解】 考查名词辨析。句意:他的叙述与其他目击者讲的有矛盾。然而在我看来,他所说的有可能是真的。A. expectation期望;B. instruction指示;C. response 回应 ;D. account陈述。由“yet his story”可知,account符合句意。故D选项正确。 4.Only when women are enabled to become strong will our families, our economies, and our societies reach their fullest . A.distinction B.innovation C.potential D.appreciation 【答案】C 【解析】 【详解】 考查名词。A. distinction区别; B. innovation创新; C. potential潜能; D. appreciation 欣赏。句意:只有当妇女能够变得强大时,我们的家庭、经济和社会才能充分发挥其潜力。结合句意可知答案为C。 5.Violent programs on television may have a bad on children. A.injury B.pressure

should用法归纳与练习

should用法归纳 一、Should 表示过去将来时,即从过去观点看将来要发生的事,多用于间接引语中。 We thought that we should never see you again. 我们想我们再也看不到你了。 The BBC weather report this morning said that we should have rain. 今天早上,BBC电台天气报告说,今天有雨。 二、Should 表示义务、责任、常译为“应当”,“应该”,或表示一种估计的情况,译成“按理应当”,“估计......”。 Why should I pay him? 为什么我该付给他钱? They should be there by now,I think. 我估计,他们现在到那儿了。 Should 用于完成时态,表示对过去发生的动作的一种推测,译成“应该已经......”。 You should have washed the wood. (But you haven…t.) 你应该把伤口清洗了。(然而你没有) 三、在某些从句中,should 表示惊异、意外等情绪,常译为“竟然”。 It seems unfair that this should happen to me.真不公平,这件事竟然发生在我身上。 四、当陈述部分含有ought to ,其反意疑问句部分,美国英语中用should . She ought to stay here,shouldn't her?她该留在这儿,是吗? 五、用于成语中I should like to......“我想(做)......” I should like to ask the teacher a question. 我想问老师一个问题。 六、"should (not) +have+过去分词(done)" 对已发生的事表示遗憾或责备,表达"本该或不该"之意。如:①He also learns that he should have cared more about his friends.他还明白了他本应该多关心朋友。 ②He shouldn't have let out the secret.他本不该泄露秘密的。(实际情况是"他已泄密"。) 翻译:①If he were here, 如果他(现在)在这里的话,我就会告诉他真相。(事实是,他现在不在这里。)

英语名词用法详解

英语名词用法详解 一、单项选择名词 1.A new ______ to teaching languages is being used here, and it has turned out to be very helpful to the students. A.approach B.means C.method D.way 【答案】A 【解析】 【详解】 考查名词词义辨析。句意:教学语言的一个新的方法正在这儿被使用,这证明对学生很有用。这几个词都有“方法”的意思,但是A. approach 后面接to doing;B. means,method,way后面都是of doing,way还可以接不定式。故选A。 2.On November 11, Alibaba sold more than 210 billion yuan ___________ goods on its e-commerce platforms https://www.360docs.net/doc/1112702734.html, and TMall, making headlines all over the world. A.sum of B.value for C.worth of D.profit for 【答案】C 【解析】 【详解】 考名词短语辨析。A. sum of……的总和;B. value for物有所值(多形容质量);C. worth of 值……的价值(多用于实际价值);D. profit for利润为。句意:11月11日,阿里巴巴在其电子商务平台淘宝和天猫上销售了价值2100多亿元的商品,成为全世界的头条新闻。 3.As for your ________ about the shoes, sir, I will speak to the person in charge and ask him either to give you another pair or to give your money back. A.composition B.compromise C.complaint D.concept 【答案】C 【解析】 【详解】 考查名词。A. composition作文; B. compromise妥协; C. complaint抱怨; D. concept 概念。句意:先生,关于你对这双鞋的投诉,我会和负责的人谈谈,让他要么给你另一双鞋,要么把钱还给你。complaint about“对------抱怨”,故选C。 4.Now that the banks are back on their feet, we expect the extraordinary______ from them to help rebuild the economy. A.category B.commitment C.component D.competence 【答案】B

相关文档
最新文档