【VSCode】使用VSCode创建Java C/S架构项目

使用VSCode创建Java C/S架构项目

在VSCode中创建Java客户端/服务器(C/S)架构项目需要一些配置步骤。下面我将指导您完成整个过程。

环境准备

  1. 安装VSCode
  2. 安装Java扩展包(Extension Pack for Java)
  3. 安装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"]
        }
    ]
}

编译和运行

  1. 首先编译共享模块:

    复制代码
    javac -encoding UTF-8 -d shared/bin shared/src/Message.java
  2. 编译服务器:

    复制代码
    javac -encoding UTF-8 -cp "shared/bin" -d server/bin server/src/Server.java
  3. 编译客户端:

    复制代码
    javac -encoding UTF-8 -cp "shared/bin" -d client/bin client/src/Client.java
  4. 运行服务器:

    复制代码
    java -cp "server/bin;shared/bin" Server
  5. 运行客户端(在另一个终端):

    复制代码
    java -cp "client/bin;shared/bin" Client

使用VSCode运行和调试

  1. 打开VSCode的"Run and Debug"视图
  2. 选择"Launch Server"配置并运行
  3. 选择"Launch Client"配置并运行(可以运行多个客户端实例)

注意:端口(12345)改成自己的,不要被占用

扩展建议

  1. 添加GUI界面(使用JavaFX或Swing)
  2. 实现数据库持久化
  3. 添加用户认证系统
  4. 实现群组聊天功能
  5. 添加文件传输功能

这个基础C/S架构为您提供了一个起点,您可以根据需要进一步扩展功能。