Java新AIO/NIO2:AsynchronousServerSocketChannel和AsynchronousSocketChannel简单服务器-客户端

版权声明:本文为Zhang Phil原创文章,请不要转载! https://blog.csdn.net/zhangphil/article/details/88184067

Java新AIO/NIO2:AsynchronousServerSocketChannel和AsynchronousSocketChannel简单服务器-客户端

用AsynchronousServerSocketChannel和AsynchronousSocketChannel实现一个最简单的服务器-客户端程序。服务器用AsynchronousServerSocketChannel实现,客户端用AsynchronousSocketChannel实现。服务器绑定本地端口80,等待客户端连接。服务器与客户端建立连接后服务器发给客户端字符串“zhangphil”,然后服务器关闭Socket连接,客户端接收数据后也关闭Socket连接。
服务器端:

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.util.concurrent.Future;

public class Server {
	public static void main(String[] args) {
		try {
			Server server = new Server();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public Server() throws Exception {
		AsynchronousServerSocketChannel serverSocketChannel = AsynchronousServerSocketChannel.open();
		InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", 80);
		serverSocketChannel.bind(inetSocketAddress);

		Future<AsynchronousSocketChannel> accept;

		while (true) {
			// accept()不会阻塞。
			accept = serverSocketChannel.accept();

			System.out.println("=================");
			System.out.println("服务器等待连接...");
			AsynchronousSocketChannel socketChannel = accept.get();// get()方法将阻塞。

			System.out.println("服务器接受连接");
			System.out.println("服务器与" + socketChannel.getRemoteAddress() + "建立连接");

			ByteBuffer buffer = ByteBuffer.wrap("zhangphil".getBytes());
			Future<Integer> write=socketChannel.write(buffer);
			
			while(!write.isDone()) {
				Thread.sleep(10);
			}
			
			System.out.println("服务器发送数据完毕.");
			socketChannel.close();
		}
	}
}

客户端:

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.util.concurrent.Future;

public class Client {
	public static void main(String[] args) {
		AsynchronousSocketChannel socketChannel = null;
		try {
			socketChannel = AsynchronousSocketChannel.open();
			InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", 80);
			Future<Void> connect = socketChannel.connect(inetSocketAddress);

			while (!connect.isDone()) {
				Thread.sleep(10);
			}

			System.out.println("建立连接" + socketChannel.getRemoteAddress());

			ByteBuffer buffer = ByteBuffer.allocate(1024);
			Future<Integer> read = socketChannel.read(buffer);

			while (!read.isDone()) {
				Thread.sleep(10);
			}

			System.out.println("接收服务器数据:" + new String(buffer.array(), 0, read.get()));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

先运行服务器端程序,再运行客户端程序。然后服务器端输出:

客户端输出:

建立连接localhost/127.0.0.1:80
接收服务器数据:zhangphil

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/88184067
今日推荐