在互联网时代,网络编程是计算机科学中不可或缺的一部分。Java作为一种广泛使用的编程语言,提供了强大的网络编程功能。Socket编程是Java网络编程的核心,通过Socket编程可以实现不同计算机之间的实时通信。本文将带你轻松掌握Socket编程,并通过实战案例让你亲身体验到网络编程的魅力。
一、Socket编程基础
1.1 什么是Socket
Socket,即“套接字”,是网络通信中的一个端点。它由IP地址和端口号组成,用于标识网络中的一台计算机上的一个程序。Socket编程就是通过建立、发送和接收数据来实现网络通信。
1.2 Socket编程模型
Socket编程模型主要有两种:客户端-服务器模型和服务器-客户端模型。
- 客户端-服务器模型:客户端主动发起连接,服务器被动接受连接。
- 服务器-客户端模型:服务器主动发起连接,客户端被动接受连接。
1.3 Java Socket编程API
Java提供了丰富的Socket编程API,包括:
java.net.ServerSocket:服务器端Socket。java.net.Socket:客户端Socket。java.io.InputStream和java.io.OutputStream:用于读写数据。
二、Socket编程实战案例
2.1 实现一个简单的聊天程序
下面是一个简单的聊天程序,其中服务器端负责接收客户端发送的消息,并将消息转发给所有连接的客户端。
服务器端代码:
import java.io.*;
import java.net.*;
public class ChatServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("服务器启动,等待客户端连接...");
while (true) {
Socket socket = serverSocket.accept();
new Thread(new ClientHandler(socket)).start();
}
}
}
class ClientHandler implements Runnable {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message;
while ((message = reader.readLine()) != null) {
System.out.println("客户端:" + message);
// 将消息转发给所有连接的客户端
sendToAllClients(message);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void sendToAllClients(String message) throws IOException {
for (Socket socket : ChatServer.clients) {
PrintWriter writer = new PrintWriter(socket.getOutputStream());
writer.println(message);
writer.flush();
}
}
}
客户端代码:
import java.io.*;
import java.net.*;
public class ChatClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 6666);
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream());
Thread readerThread = new Thread(() -> {
try {
String message;
while ((message = reader.readLine()) != null) {
System.out.println("服务器:" + message);
}
} catch (IOException e) {
e.printStackTrace();
}
});
readerThread.start();
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
String message;
while ((message = consoleReader.readLine()) != null) {
writer.println(message);
writer.flush();
}
writer.close();
socket.close();
}
}
2.2 实现一个文件传输程序
下面是一个简单的文件传输程序,其中服务器端负责接收客户端发送的文件,并将文件存储到本地目录。
服务器端代码:
import java.io.*;
import java.net.*;
public class FileServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(6666);
System.out.println("服务器启动,等待客户端连接...");
while (true) {
Socket socket = serverSocket.accept();
new Thread(new FileHandler(socket)).start();
}
}
}
class FileHandler implements Runnable {
private Socket socket;
public FileHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
DataInputStream input = new DataInputStream(socket.getInputStream());
String fileName = input.readUTF();
File file = new File(fileName);
FileOutputStream output = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len;
while ((len = input.read(buffer)) != -1) {
output.write(buffer, 0, len);
}
output.close();
input.close();
socket.close();
System.out.println("文件传输成功:" + fileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码:
import java.io.*;
import java.net.*;
public class FileClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 6666);
DataOutputStream output = new DataOutputStream(socket.getOutputStream());
String fileName = "example.txt";
output.writeUTF(fileName);
FileInputStream input = new FileInputStream(fileName);
byte[] buffer = new byte[1024];
int len;
while ((len = input.read(buffer)) != -1) {
output.write(buffer, 0, len);
}
input.close();
output.close();
socket.close();
System.out.println("文件传输成功:" + fileName);
}
}
三、总结
通过本文的学习,相信你已经对Java Socket编程有了初步的了解。Socket编程是实现网络通信的重要手段,通过Socket编程可以实现实时通信、文件传输等功能。在实际开发中,Socket编程有着广泛的应用,希望本文能帮助你轻松掌握Socket编程,为你的网络编程之路奠定基础。
