《netty》javaNIO之利用SocketChannel和ServerSocketChannel实现客户端与服务器端简单通信

10 篇文章 0 订阅
6 篇文章 0 订阅

服务端 

import java.io.IOException;

import java.net.InetSocketAddress;

import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;



/**
 *  1.通过ServerSocketChannel 绑定ip地址和端口号
	2.通过ServerSocketChannelImpl的accept()方法创建一个SocketChannel对象用户从客户端读/写数据
	3.创建读数据/写数据缓冲区对象来读取客户端数据或向客户端发送数据
	4. 关闭SocketChannel和ServerSocketChannel
 * @author guokaige
 *
 */
public class WebServer {
    public static void main(String[] args) throws IOException {
        try {
            //1.通过ServerSocketChannel 的open()方法创建一个ServerSocketChannel对象,open方法的作用:打开套接字通道
            ServerSocketChannel ssc = ServerSocketChannel.open();

            //2.通过ServerSocketChannel绑定ip地址和port(端口号)
            ssc.socket().bind(new InetSocketAddress("127.0.0.1", 3333));

            //通过ServerSocketChannelImpl的accept()方法创建一个SocketChannel对象用户从客户端读/写数据
            SocketChannel socketChannel = ssc.accept();

            //3.创建写数据的缓存区对象
            ByteBuffer writeBuffer = ByteBuffer.allocate(128);
            writeBuffer.put("hello WebClient this is from WebServer".getBytes());
            writeBuffer.flip();
            socketChannel.write(writeBuffer);

            //创建读数据的缓存区对象
            ByteBuffer readBuffer = ByteBuffer.allocate(128);

            //读取缓存区数据
            socketChannel.read(readBuffer);

            StringBuilder stringBuffer = new StringBuilder();

            //4.将Buffer从写模式变为可读模式
            readBuffer.flip();

            while (readBuffer.hasRemaining()) {
                stringBuffer.append((char) readBuffer.get());
            }

            System.out.println("从客户端接收到的数据:" + stringBuffer);
            socketChannel.close();
            ssc.close();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端

import java.io.IOException;

import java.net.InetSocketAddress;

import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

/**
 * 1.通过SocketChannel连接到远程服务器
   2.创建读数据/写数据缓冲区对象来读取服务端数据或向服务端发送数据
   3.关闭SocketChannel
 * @author guokaige
 *
 */
public class WebClient {
    public static void main(String[] args) throws IOException {
        //1.通过SocketChannel的open()方法创建一个SocketChannel对象
        SocketChannel socketChannel = SocketChannel.open();

        //2.连接到远程服务器(连接此通道的socket)
        socketChannel.connect(new InetSocketAddress("127.0.0.1", 3333));

        // 3.创建写数据缓存区对象
        ByteBuffer writeBuffer = ByteBuffer.allocate(128);
        writeBuffer.put("hello WebServer this is from WebClient".getBytes());
        writeBuffer.flip();
        socketChannel.write(writeBuffer);

        //创建读数据缓存区对象
        ByteBuffer readBuffer = ByteBuffer.allocate(128);
        socketChannel.read(readBuffer);

        //String 字符串常量,不可变;StringBuffer 字符串变量(线程安全),可变;StringBuilder 字符串变量(非线程安全),可变
        StringBuilder stringBuffer = new StringBuilder();

        //4.将Buffer从写模式变为可读模式
        readBuffer.flip();

        while (readBuffer.hasRemaining()) {
            stringBuffer.append((char) readBuffer.get());
        }

        System.out.println("从服务端接收到的数据:" + stringBuffer);
        socketChannel.close();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值