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<SelectionKey> selectorKeys = selector.selectedKeys();
Iterator<SelectionKey> 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();