Pratique de programmation réseau avec la technologie sous-jacente Java : Comment implémenter la communication Socket et NIO
1. Introduction
Avec le développement rapide d'Internet, la programmation réseau devient de plus en plus importante dans le développement de logiciels modernes. En tant que langage largement utilisé dans la programmation réseau, Java fournit un support technique sous-jacent riche. Parmi eux, la communication Socket et NIO sont deux méthodes de programmation réseau courantes et importantes en Java. Cet article explique comment utiliser Java pour implémenter la communication Socket et NIO, et donne des exemples de code spécifiques.
2. Communication Socket
La communication Socket est une méthode de programmation réseau basée sur le protocole de couche transport. Elle établit une connexion de communication entre le client et le serveur via des sockets (Socket). Java fournit les classes Socket et ServerSocket dans le package java.net pour implémenter la communication Socket.
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 (New I/O) est une fonctionnalité d'E/S non bloquantes en Java qui utilise moins de threads. Implémentez une programmation réseau à haute concurrence. Java fournit Channel, Buffer, Selector et d'autres classes dans le package java.nio pour implémenter 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(); } } }
Résumé
Cet article présente la communication Socket et NIO dans la technologie sous-jacente de Java et donne des exemples de code spécifiques. Grâce à ces exemples, nous pouvons apprendre à utiliser Java pour la programmation réseau et comprendre les principes de base et l'utilisation de la communication Socket et de NIO. Dans le développement réel, le choix de la méthode de programmation réseau appropriée en fonction des besoins spécifiques peut améliorer les performances et les capacités de traitement simultané du programme. J'espère que les lecteurs pourront mieux comprendre et appliquer la technologie de programmation réseau sous-jacente de Java grâce au contenu de cet article.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!