首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

NIO系列(四)——socket通道和serversocket通道

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/luo4105/article/details/73650414

SocketChannel

SocketChannel是一个连接到tcp网络套接字的通道。可以通过以下2中方式创建

1.打开一个SocketChannel并连接到互联网上的某台服务器。

代码语言:javascript
复制
SocketChannel client = SocketChannel.open(new InetSocketAddress("127.0.0.1",10699));

2.ServerSocketChannel获得一个网络连接。

代码语言:javascript
复制
SocketChannel connctClient = server.accept();

创建SocketChannel

通过SocketChannel.Open()方法创建通道,open()方法可以传入连接对象的参数。

代码语言:javascript
复制
SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("192.168.1.107",9999));

关闭SocketChannel

通过close()方法关闭通道。

代码语言:javascript
复制
socketChannel.close();

socketChannel接收信息

可以通过read()方法把通道数据读到缓存中。

代码语言:javascript
复制
ByteBuffer bBuffer = ByteBuffer.allocate(48);
int readSize;
do {
    readSize = socketChannel.read(bBuffer);
    bBuffer.flip();
    System.out.println(Charset.forName("UTF-8").decode(bBuffer));
    bBuffer.clear();
} while (readSize != -1);

read()返回的int值表示读到缓存数据的长度,当返回值为-1时,表示到了流的末尾。

SocketChannel发送信息

通过write()方法将缓存数据写入到通道内,write()无法保证一次向通道中写入多少数据,所以要循环判断hasRemainning(),直到没有数据写入。

代码语言:javascript
复制
ByteBuffer bBuffer = ByteBuffer.wrap(("服务器" + server + "连接成功").getBytes());
while (bBuffer.hasRemaining()){
    socketChannel.write(bBuffer);
}

非阻塞设置

SocketChannel可以通过configureBlocking()方法设置成非阻塞。

代码语言:javascript
复制
socketChannel.configureBlocking(false);

例子

这个例子是与192.168.1.107:9999建立连接并接收一次发送数据。

代码语言:javascript
复制
public voidtestClient() {
    try {
       SocketChannelsocketChannel= SocketChannel.open();
       socketChannel.configureBlocking(false);
       socketChannel.connect(new InetSocketAddress("192.168.1.107",9999));
       ByteBufferbBuffer= ByteBuffer.allocate(48);
       int readSize;
       do {
           readSize = socketChannel.read(bBuffer);
           bBuffer.flip();
           System.out.println(Charset.forName("UTF-8").decode(bBuffer));
           bBuffer.clear();
       }while(readSize!= -1);
       socketChannel.close();
    }catch(IOException e) {
       e.printStackTrace();
    }
}

ServerSocketChannel

Java NIO的ServerSocketChannel是一个可以监听新进来的TCP连接的通道,就像标准IO的ServerSocket一样。

创建ServerSocketChannel

通过ServerSocketChannel.open()创建通道

代码语言:javascript
复制
ServerSocketChannel server = ServerSocketChannel.open();
server.socket().bind(new InetSocketAddress(9999));

server.socket().bind(SocketAddressendpoint, int backlog)可以传两个参数,第二个参数是,限制最大连接数。

获得连接

通过accept()方法,获得socket连接

代码语言:javascript
复制
SocketChannel socketChannel = server.accept();

发送数据和接收数据都通过SocketChannel进行。

关闭ServerSocketChannel

通过close()方法关闭通道

代码语言:javascript
复制
server.close();

非阻塞设置

ServerSocketChannel可以设置成非阻塞模式。在非阻塞模式下,accept会立即返回,所以要判断SocketChannel是否为空。

代码语言:javascript
复制
server.configureBlocking(false);
while (true){
    SocketChannelsocketChannel= server.accept();
    if (socketChannel != null) {
      
    }
}

例子

这个例子先绑定监听9999端口,但有socket连接时,会发送一条数据。

代码语言:javascript
复制
public voidtestServer() {
    try {
       ServerSocketChannelserver= ServerSocketChannel.open();
       server.socket().bind(newInetSocketAddress(9999));
       System.out.println("服务端启动成功");
       server.configureBlocking(false);
       while (true) {
           SocketChannelsocketChannel= server.accept();
           if (socketChannel != null) {
              System.out.println(socketChannel + "连接成功");
              ByteBufferbBuffer= ByteBuffer.wrap(("服务器" + server + "连接成功").getBytes());
              while (bBuffer.hasRemaining()) {
                  socketChannel.write(bBuffer);
              }
           }
       }
    }catch(IOException e) {
       e.printStackTrace();
    }
}
下一篇
举报
领券