Java 基盤技術のネットワーク プログラミング実践: ソケット通信と NIO の実装方法
1. はじめに
インターネットの急速な発展に伴い、ネットワーク プログラミングは、現代のソフトウェア開発においてますます重要になっています。 Java は、ネットワーク プログラミングで広く使用されている言語として、基礎となる豊富な技術サポートを提供します。その中でも、ソケット通信と NIO は、Java における 2 つの一般的かつ重要なネットワーク プログラミング手法です。この記事では、Java を使用してソケット通信と NIO を実装する方法と、具体的なコード例を紹介します。
2. ソケット通信
ソケット通信は、トランスポート層プロトコルに基づいたネットワークプログラミング手法であり、ソケット(Socket)を介してクライアントとサーバー間の通信接続を確立します。 Java は、ソケット通信を実装するために、java.net パッケージで Socket クラスと ServerSocket クラスを提供します。
import java.io.*; import java.net.*; public class Client { public static void main(String[] args) { try { // 创建Socket对象,并指定服务器的IP地址和端口号 Socket socket = new Socket("127.0.0.1", 8888); // 获取输出流,用于向服务器发送数据 OutputStream os = socket.getOutputStream(); PrintWriter pw = new PrintWriter(os); // 向服务器发送数据 pw.write("Hello, Server!"); pw.flush(); // 关闭输出流和Socket连接 pw.close(); os.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
import java.io.*; import java.net.*; public class Server { public static void main(String[] args) { try { // 创建ServerSocket对象,并指定监听的端口号 ServerSocket serverSocket = new ServerSocket(8888); // 等待客户端连接 Socket socket = serverSocket.accept(); // 获取输入流,用于接收客户端发送的数据 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 接收客户端发送的数据 System.out.println("Received from client: " + br.readLine()); // 关闭输入流、Socket连接和ServerSocket连接 br.close(); is.close(); socket.close(); serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }
3. NIO
NIO (新規) I/O) は、Java のノンブロッキング I/O 機能で、より少ないスレッドを使用して高度な同時ネットワーク プログラミングを可能にします。 Java は、NIO を実装するために、Channel、Buffer、Selector、およびその他のクラスを java.nio パッケージで提供します。
import java.io.*; import java.nio.*; import java.nio.channels.*; public class Client { public static void main(String[] args) { try { // 创建SocketChannel对象,并连接服务器 SocketChannel socketChannel = SocketChannel.open(); socketChannel.connect(new InetSocketAddress("127.0.0.1", 8888)); // 发送数据给服务器 String message = "Hello, Server!"; ByteBuffer buffer = ByteBuffer.wrap(message.getBytes()); socketChannel.write(buffer); // 关闭SocketChannel连接 socketChannel.close(); } catch (IOException e) { e.printStackTrace(); } } }
import java.io.*; import java.nio.*; import java.nio.channels.*; public class Server { public static void main(String[] args) { try { // 创建ServerSocketChannel对象,并绑定监听的端口号 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.bind(new InetSocketAddress(8888)); // 设置为非阻塞模式 serverSocketChannel.configureBlocking(false); // 创建Selector对象,并将ServerSocketChannel注册到Selector上 Selector selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); while (true) { // 阻塞式等待就绪的事件 selector.select(); // 获取就绪的事件集合 Set<SelectionKey> selectedKeys = selector.selectedKeys(); Iterator<SelectionKey> iterator = selectedKeys.iterator(); // 处理就绪事件 while (iterator.hasNext()) { SelectionKey key = iterator.next(); // 接收客户端连接请求 if (key.isAcceptable()) { ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel(); SocketChannel socketChannel = serverChannel.accept(); // 设置为非阻塞模式 socketChannel.configureBlocking(false); // 注册读事件到Selector上 socketChannel.register(selector, SelectionKey.OP_READ); } // 读取客户端发送的数据 if (key.isReadable()) { SocketChannel socketChannel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate(1024); // 读取数据到缓冲区 int bytesRead = socketChannel.read(buffer); if (bytesRead > 0) { buffer.flip(); // 提取缓冲区中的数据 byte[] data = new byte[bytesRead]; buffer.get(data); String message = new String(data); System.out.println("Received from client: " + message); } // 关闭客户端连接 socketChannel.close(); } // 从处理集合中移除当前就绪的事件 iterator.remove(); } } } catch (IOException e) { e.printStackTrace(); } } }
以上がJava基盤技術のネットワークプログラミング実践:ソケット通信とNIOの実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。