Java.net是Java平台提供的用于网络编程的API集合。它提供了在Java应用程序中实现网络连接和通信所需的基本组件和类。Java.net包含了一系列类,如Socket、ServerSocket、URL等,它们可以帮助我们实现网络编程。
一、Socket和ServerSocket
Socket类提供了一种机制,使得两个进程之间可以进行通信。通过Socket类,可以建立一个客户端到服务器的连接。当Socket连接建立后,客户端和服务器之间可以发送和接收数据。
ServerSocket类是另一种重要的类,它允许我们创建一个服务端应用程序。服务端应用程序等待客户端的请求,当有客户端发起请求后,服务端就可以通过Socket对象与客户端通信。下面是一个简单的使用Socket和ServerSocket实现通信的示例代码。
// 服务端程序 ServerSocket serverSocket = new ServerSocket(8080); Socket socket = serverSocket.accept(); InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); inputStream.read(); outputStream.write("Hello World".getBytes()); socket.close(); serverSocket.close(); // 客户端程序 Socket socket = new Socket("localhost", 8080); OutputStream outputStream = socket.getOutputStream(); InputStream inputStream = socket.getInputStream(); outputStream.write("Hello Server".getBytes()); inputStream.read(); socket.close();
二、URL和URLConnection
URL类表示一个统一资源定位器,在Java中,我们可以通过URL类来表示网络上的资源。URLConnection类可以通过URL来获取网络资源的输入流和输出流,也可以设置网络连接的各种属性。下面是一个简单的URL和URLConnection的实例代码。
URL url = new URL("http://www.baidu.com"); URLConnection urlConnection = url.openConnection(); InputStream inputStream = urlConnection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = bufferedReader.readLine()) != null) { System.out.println(line); } bufferedReader.close(); inputStream.close();
三、DatagramSocket
DatagramSocket类提供了面向数据包的UDP协议的通信功能。它可以用于实现广播和多播等应用场景。下面是一个简单的使用DatagramSocket实现UDP通信的示例代码。
// 服务端程序 DatagramSocket serverSocket = new DatagramSocket(8080); byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); serverSocket.receive(packet); System.out.println(new String(packet.getData())); serverSocket.close(); // 客户端程序 DatagramSocket clientSocket = new DatagramSocket(); byte[] buffer = "Hello Server".getBytes(); InetAddress inetAddress = InetAddress.getByName("localhost"); DatagramPacket packet = new DatagramPacket(buffer, buffer.length, inetAddress, 8080); clientSocket.send(packet); clientSocket.close();
四、HttpURLConnection
HttpURLConnection类是URLConnection的子类,它提供了HTTP协议的HTTP/1.1支持。它可以用于实现HTTP客户端,可以通过HTTP请求获取HTTP响应。下面是一个简单的使用HttpURLConnection实现HTTP通信的示例代码。
// 发起HTTP GET请求 URL url = new URL("http://www.baidu.com"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setDoOutput(true); StringBuilder responseBuilder = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); String line; while ((line = reader.readLine()) != null) { responseBuilder.append(line); } urlConnection.disconnect(); reader.close(); // 发起HTTP POST请求 url = new URL("http://www.baidu.com"); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("POST"); urlConnection.setDoOutput(true); OutputStreamWriter writer = new OutputStreamWriter(urlConnection.getOutputStream()); writer.write("Hello Server"); writer.flush(); reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); responseBuilder = new StringBuilder(); while ((line = reader.readLine()) != null) { responseBuilder.append(line); } urlConnection.disconnect(); reader.close(); writer.close();
五、SocketChannel和ServerSocketChannel
Java.net提供了使用NIO实现非阻塞I/O的类SocketChannel和ServerSocketChannel。它们可以用于实现高并发的网络编程应用场景。下面是一个简单的使用SocketChannel和ServerSocketChannel实现非阻塞I/O的示例代码。
// 服务端程序 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.socket().bind(new InetSocketAddress(8080)); serverSocketChannel.configureBlocking(false); Selector selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); while (true) { int readyChannels = selector.select(); if (readyChannels == 0) { continue; } Set selectorKeys = selector.selectedKeys(); Iterator iterator = selectorKeys.iterator(); while (iterator.hasNext()) { SelectionKey selectionKey = iterator.next(); if (selectionKey.isAcceptable()) { SocketChannel socketChannel = serverSocketChannel.accept(); socketChannel.configureBlocking(false); socketChannel.register(selector, SelectionKey.OP_READ); } else if (selectionKey.isReadable()) { SocketChannel socketChannel = (SocketChannel) selectionKey.channel(); ByteBuffer buffer = ByteBuffer.allocate(1024); socketChannel.read(buffer); buffer.flip(); socketChannel.write(buffer); } iterator.remove(); } } // 客户端程序 SocketChannel socketChannel = SocketChannel.open(); socketChannel.connect(new InetSocketAddress("localhost", 8080)); socketChannel.configureBlocking(false); ByteBuffer buffer = ByteBuffer.wrap("Hello Server".getBytes()); while (buffer.hasRemaining()) { socketChannel.write(buffer); } buffer.clear(); socketChannel.read(buffer); socketChannel.close();
原创文章,作者:WZNSV,如若转载,请注明出处:https://www.506064.com/n/361561.html