在数字化时代,网络编程是软件开发不可或缺的一部分。Java作为一种跨平台的语言,在网络编程领域有着广泛的应用。本文将带你从入门到实战,全面了解Java网络编程,轻松实现数据传输。
一、Java网络编程基础
1. 网络通信模型
在Java中,网络通信主要基于TCP/IP协议。TCP/IP协议分为四层:应用层、传输层、网络层和数据链路层。Java网络编程主要涉及传输层和网络层。
2. Java网络编程API
Java提供了丰富的网络编程API,包括:
java.net包:提供URL、InetAddress、Socket等类。java.nio包:提供NIO(非阻塞I/O)相关类,如Selector、Channel、Buffer等。
二、Java网络编程实战
1. 基本网络编程
TCP客户端
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class TcpClient {
public static void main(String[] args) {
try (Socket socket = new Socket("127.0.0.1", 6666);
PrintWriter out = new PrintWriter(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
out.println("Hello, Server!");
System.out.println("Server: " + in.readLine());
} catch (Exception e) {
e.printStackTrace();
}
}
}
TCP服务器
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(6666);
Socket socket = serverSocket.accept();
PrintWriter out = new PrintWriter(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
String line;
while ((line = in.readLine()) != null) {
System.out.println("Client: " + line);
out.println("Hello, Client!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. NIO编程
NIO客户端
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
public class NioClient {
public static void main(String[] args) {
try (SocketChannel socketChannel = SocketChannel.open()) {
socketChannel.connect(new InetSocketAddress("127.0.0.1", 6666));
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.put("Hello, Server!".getBytes());
buffer.flip();
socketChannel.write(buffer);
buffer.clear();
int readBytes = socketChannel.read(buffer);
System.out.println("Server: " + new String(buffer.array(), 0, readBytes));
} catch (Exception e) {
e.printStackTrace();
}
}
}
NIO服务器
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class NioServer {
public static void main(String[] args) {
try (Selector selector = Selector.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open()) {
serverSocketChannel.bind(new InetSocketAddress(6666));
serverSocketChannel.configureBlocking(false);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select();
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> keyIterator = keys.iterator();
while (keyIterator.hasNext()) {
SelectionKey key = keyIterator.next();
if (key.isAcceptable()) {
registerClient(selector, serverSocketChannel);
} else if (key.isReadable()) {
readData(key);
}
keyIterator.remove();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void registerClient(Selector selector, ServerSocketChannel serverSocketChannel) throws IOException {
SocketChannel client = serverSocketChannel.accept();
client.configureBlocking(false);
client.register(selector, SelectionKey.OP_READ);
}
private static void readData(SelectionKey key) throws IOException {
SocketChannel client = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int readBytes = client.read(buffer);
if (readBytes > 0) {
System.out.println("Client: " + new String(buffer.array(), 0, readBytes));
buffer.clear();
}
}
}
3. HTTP客户端和服务器
HTTP客户端
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpClient {
public static void main(String[] args) {
try {
URL url = new URL("http://www.example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
HTTP服务器
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class HttpServer {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(8080)) {
while (true) {
Socket clientSocket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String request = in.readLine();
OutputStream out = clientSocket.getOutputStream();
out.write("HTTP/1.1 200 OK\r\n".getBytes());
out.write("Content-Type: text/plain\r\n\r\n".getBytes());
out.write("Hello, World!".getBytes());
out.close();
in.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、总结
通过本文的学习,相信你已经掌握了Java网络编程的基础知识和实战技巧。在实际开发中,不断积累经验,提高自己的编程能力,才能在网络编程领域游刃有余。祝你在网络编程的道路上越走越远!
