使用VSCode创建Java C/S架构项目
在VSCode中创建Java客户端/服务器(C/S)架构项目需要一些配置步骤。下面我将指导您完成整个过程。
环境准备
- 安装VSCode
- 安装Java扩展包(Extension Pack for Java)
- 安装JDK(建议JDK 11或更高版本)
创建项目结构
1. 创建项目文件夹结构
java-cs-project/
├── client/
│ ├── src/
│ │ └── Client.java
│ └── bin/
├── server/
│ ├── src/
│ │ └── Server.java
│ └── bin/
└── shared/
├── src/
│ └── Message.java
└── bin/
2. 创建共享消息类
首先创建shared/src/Message.java
:
java
import java.io.Serializable;
public class Message implements Serializable {
private String sender;
private String content;
private long timestamp;
public Message(String sender, String content) {
this.sender = sender;
this.content = content;
this.timestamp = System.currentTimeMillis();
}
// Getters and setters
public String getSender() { return sender; }
public void setSender(String sender) { this.sender = sender; }
public String getContent() { return content; }
public void setContent(String content) { this.content = content; }
public long getTimestamp() { return timestamp; }
@Override
public String toString() {
return "[" + new java.util.Date(timestamp) + "] " + sender + ": " + content;
}
}
3. 创建服务器端
创建server/src/Server.java
:
java
import java.io.*;
import java.net.*;
import java.util.concurrent.*;
public class Server {
private static final int PORT = 12345;
private static ExecutorService pool = Executors.newFixedThreadPool(10);
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
System.out.println("Server started on port " + PORT);
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("New client connected: " + clientSocket.getInetAddress());
ClientHandler clientThread = new ClientHandler(clientSocket);
pool.execute(clientThread);
}
} catch (IOException e) {
System.err.println("Server exception: " + e.getMessage());
e.printStackTrace();
} finally {
pool.shutdown();
}
}
private static class ClientHandler implements Runnable {
private Socket clientSocket;
private ObjectOutputStream out;
private ObjectInputStream in;
public ClientHandler(Socket socket) {
this.clientSocket = socket;
}
@Override
public void run() {
try {
out = new ObjectOutputStream(clientSocket.getOutputStream());
in = new ObjectInputStream(clientSocket.getInputStream());
Message message;
while ((message = (Message) in.readObject()) != null) {
System.out.println("Received: " + message);
// Echo back to client
out.writeObject(message);
out.flush();
}
} catch (IOException | ClassNotFoundException e) {
System.out.println("Client disconnected: " + clientSocket.getInetAddress());
} finally {
try {
if (in != null) in.close();
if (out != null) out.close();
if (clientSocket != null) clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4. 创建客户端
创建client/src/Client.java
:
java
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Client {
private static final String SERVER_ADDRESS = "localhost";
private static final int SERVER_PORT = 12345;
public static void main(String[] args) {
try (
Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT);
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
Scanner scanner = new Scanner(System.in)
) {
System.out.println("Connected to server at " + SERVER_ADDRESS + ":" + SERVER_PORT);
// Thread for receiving messages from server
Thread receiveThread = new Thread(() -> {
try {
Message receivedMessage;
while ((receivedMessage = (Message) in.readObject()) != null) {
System.out.println(receivedMessage);
}
} catch (IOException | ClassNotFoundException e) {
System.out.println("Disconnected from server");
}
});
receiveThread.start();
// Main thread for sending messages
System.out.print("Enter your name: ");
String name = scanner.nextLine();
String input;
while (true) {
System.out.print("Enter message (or 'quit' to exit): ");
input = scanner.nextLine();
if ("quit".equalsIgnoreCase(input)) {
break;
}
Message message = new Message(name, input);
out.writeObject(message);
out.flush();
}
} catch (UnknownHostException e) {
System.err.println("Don't know about host " + SERVER_ADDRESS);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to " + SERVER_ADDRESS);
e.printStackTrace();
}
}
}
配置VSCode
1. 创建工作区设置
在项目根目录创建.vscode/settings.json
:
json
{
"java.project.sourcePaths": [
"client/src",
"server/src",
"shared/src"
],
"java.project.outputPath": "bin",
"java.project.referencedLibraries": []
}
2. 配置启动任务
创建.vscode/launch.json
:
json
{
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Launch Server",
"request": "launch",
"mainClass": "Server",
"projectName": "server",
"classPaths": ["shared/bin"]
},
{
"type": "java",
"name": "Launch Client",
"request": "launch",
"mainClass": "Client",
"projectName": "client",
"classPaths": ["shared/bin"]
}
]
}
编译和运行
-
首先编译共享模块:
javac -encoding UTF-8 -d shared/bin shared/src/Message.java
-
编译服务器:
javac -encoding UTF-8 -cp "shared/bin" -d server/bin server/src/Server.java
-
编译客户端:
javac -encoding UTF-8 -cp "shared/bin" -d client/bin client/src/Client.java
-
运行服务器:
java -cp "server/bin;shared/bin" Server
-
运行客户端(在另一个终端):
java -cp "client/bin;shared/bin" Client
使用VSCode运行和调试
- 打开VSCode的"Run and Debug"视图
- 选择"Launch Server"配置并运行
- 选择"Launch Client"配置并运行(可以运行多个客户端实例)
注意:端口(12345)改成自己的,不要被占用
扩展建议
- 添加GUI界面(使用JavaFX或Swing)
- 实现数据库持久化
- 添加用户认证系统
- 实现群组聊天功能
- 添加文件传输功能
这个基础C/S架构为您提供了一个起点,您可以根据需要进一步扩展功能。