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/zh-tw/n/361561.html