ServerSocketChannel ServerSocket 区别
时间: 2024-06-05 20:07:42 浏览: 10
`ServerSocket` 是 Java 中用于创建服务器端套接字的类,它可以监听客户端的连接请求,并返回与客户端通信的套接字。与之对应的是 `Socket` 类,它用于创建客户端套接字。
`ServerSocketChannel` 是 Java 中 NIO(非阻塞 I/O)中用于创建服务器端套接字通道的类,它允许异步地监听客户端的连接请求,并返回与客户端通信的套接字通道。与之对应的是 `SocketChannel` 类,它用于创建客户端套接字通道。
`ServerSocket` 和 `ServerSocketChannel` 的主要区别在于它们的阻塞模式。`ServerSocket` 是阻塞式 I/O,它在接受客户端连接请求时会阻塞当前线程,直到有客户端连接进来;而 `ServerSocketChannel` 是非阻塞式 I/O,它可以异步地监听客户端连接请求,并在有客户端连接进来时返回客户端的套接字通道,不会阻塞当前线程。因此,`ServerSocketChannel` 的性能通常比 `ServerSocket` 更好。
相关问题
ServerSocket java源码解析
ServerSocket是Java提供的用于监听客户端连接请求的类,其源码解析如下:
1. ServerSocket类的定义:
public class ServerSocket implements java.io.Closeable {
...
}
2. 构造方法:
public ServerSocket(int port) throws IOException {
...
}
public ServerSocket(int port, int backlog) throws IOException {
...
}
public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException {
...
}
3. accept()方法:
public Socket accept() throws IOException {
...
}
4. close()方法:
public void close() throws IOException {
...
}
5. setSoTimeout()方法:
public void setSoTimeout(int timeout) throws SocketException {
...
}
6. getLocalSocketAddress()方法:
public SocketAddress getLocalSocketAddress() {
...
}
7. getInetAddress()方法:
public InetAddress getInetAddress() {
...
}
8. getLocalPort()方法:
public int getLocalPort() {
...
}
9. getReceiveBufferSize()方法:
public int getReceiveBufferSize() throws SocketException {
...
}
10. setReceiveBufferSize()方法:
public void setReceiveBufferSize(int size) throws SocketException {
...
}
11. getSoTimeout()方法:
public int getSoTimeout() throws IOException {
...
}
12. setReuseAddress()方法:
public void setReuseAddress(boolean on) throws SocketException {
...
}
13. isBound()方法:
public boolean isBound() {
...
}
14. isClosed()方法:
public boolean isClosed() {
...
}
15. bind()方法:
public void bind(SocketAddress bindpoint) throws IOException {
...
}
16. getChannel()方法:
public ServerSocketChannel getChannel() {
...
}
以上是ServerSocket类的主要方法和属性,其实现原理是通过底层操作系统的socket接口实现的。当ServerSocket对象调用accept()方法时,会阻塞等待客户端的连接请求,并返回一个Socket对象用于与客户端进行通信。当ServerSocket对象调用close()方法时,会关闭ServerSocket及其对应的底层socket资源。其他方法均为一些与底层socket相关的操作,例如设置超时时间、获取本地地址等。
java selector.select() 和 serverSocket.accept(); 有什么区别
`java.nio.channels.Selector` 和 `java.nio.channels.ServerSocketChannel` 都是 Java NIO 中的类,用于实现非阻塞 I/O。
`Selector.select()` 方法是用来选取已经准备好的通道的集合,该方法会阻塞直到至少一个通道准备好了 I/O 操作。一旦有一个或多个通道准备好了 I/O 操作,该方法就会返回一个非零值,表示有多少个通道已经准备好了。你可以通过调用 `selectedKeys()` 方法来获取这些已经准备好的通道的集合。
`ServerSocketChannel.accept()` 方法是用来接受客户端连接的,该方法会阻塞直到有一个客户端连接进来。一旦有客户端连接进来,该方法就会返回一个新的 `SocketChannel` 对象,通过这个对象你可以和客户端进行通信。
简单来说,`Selector.select()` 方法是用来选取已经准备好的通道的集合,而 `ServerSocketChannel.accept()` 方法是用来接受客户端连接的。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![xmind](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)