引言
在互联网高速发展的今天,网络编程已经成为计算机科学领域的重要分支。Java作为一种跨平台、面向对象的编程语言,在网络编程领域有着广泛的应用。本文将带你从Java网络编程的入门知识讲起,逐步深入到实战应用,让你轻松搭建网络应用系统。
Java网络编程基础
1. 网络编程概述
网络编程是指利用计算机和网络通信协议,实现计算机之间数据交换的技术。Java网络编程主要基于Java的Socket编程模型,通过Socket实现客户端和服务器之间的通信。
2. Java网络编程API
Java网络编程主要依赖于以下几个核心API:
java.net包:提供了网络编程的基础类,如InetAddress、URL、URI等。java.io包:提供了输入输出流的操作,如InputStream、OutputStream、Reader、Writer等。java.nio包:提供了非阻塞I/O操作,如Selector、Channel等。
3. Socket编程模型
Socket编程模型是Java网络编程的核心,它包括客户端和服务器两个部分。
- 客户端:发起网络请求,连接服务器,发送数据,接收响应。
- 服务器:监听客户端请求,接收数据,处理请求,发送响应。
Java网络编程实战
1. 简单的TCP服务器
以下是一个简单的TCP服务器示例代码:
import java.io.*;
import java.net.*;
public class SimpleServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(12345);
System.out.println("Server is listening on port 12345");
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("New client connected");
new Thread(new ClientHandler(clientSocket)).start();
}
}
}
class ClientHandler implements Runnable {
private Socket clientSocket;
public ClientHandler(Socket socket) {
this.clientSocket = socket;
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("Received: " + inputLine);
out.println("Echo: " + inputLine);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2. 简单的TCP客户端
以下是一个简单的TCP客户端示例代码:
import java.io.*;
import java.net.*;
public class SimpleClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 12345);
System.out.println("Connected to server");
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("Server response: " + in.readLine());
}
socket.close();
}
}
3. HTTP服务器
以下是一个简单的HTTP服务器示例代码:
import java.io.*;
import java.net.*;
public class SimpleHttpServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("HTTP server is listening on port 8080");
while (true) {
Socket clientSocket = serverSocket.accept();
new Thread(new ClientHandler(clientSocket)).start();
}
}
}
class ClientHandler implements Runnable {
private Socket clientSocket;
public ClientHandler(Socket socket) {
this.clientSocket = socket;
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String requestLine = in.readLine();
if (requestLine != null) {
String[] requestParts = requestLine.split(" ");
if (requestParts.length >= 2 && "GET".equalsIgnoreCase(requestParts[0])) {
String filePath = requestParts[1];
File file = new File(filePath);
if (file.exists()) {
byte[] fileContent = readFileToByteArray(file);
out.println("HTTP/1.1 200 OK");
out.println("Content-Type: " + getContentType(filePath));
out.println("Content-Length: " + fileContent.length);
out.println();
out.write(fileContent);
out.flush();
} else {
out.println("HTTP/1.1 404 Not Found");
out.println("Content-Type: text/html");
out.println("Content-Length: 0");
out.println();
}
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private byte[] readFileToByteArray(File file) throws IOException {
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[16384];
while ((nRead = fis.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
fis.close();
return buffer.toByteArray();
}
private String getContentType(String filePath) {
String mimeType = "text/html";
int dotIndex = filePath.lastIndexOf('.');
if (dotIndex > 0) {
String fileExtension = filePath.substring(dotIndex + 1);
mimeType = getMimeType(fileExtension);
}
return mimeType;
}
private String getMimeType(String fileExtension) {
switch (fileExtension.toLowerCase()) {
case "html":
case "htm":
return "text/html";
case "css":
return "text/css";
case "js":
return "application/javascript";
case "png":
return "image/png";
case "jpg":
return "image/jpeg";
case "jpeg":
return "image/jpeg";
case "gif":
return "image/gif";
case "pdf":
return "application/pdf";
default:
return "application/octet-stream";
}
}
}
总结
通过本文的学习,你了解了Java网络编程的基础知识,掌握了Socket编程模型,并学习了如何搭建简单的TCP服务器和客户端,以及HTTP服务器。这些知识将为你进一步学习Java网络编程打下坚实的基础。在实际开发过程中,你可以根据需求选择合适的网络编程技术,构建出功能强大的网络应用系统。
