用Java代码多线程,集合,网络通信,GUI,IO,写一个租车App

时间: 2023-07-16 19:13:58 浏览: 48
好的,下面是一个简单的租车App的Java代码示例,它包含多线程、集合、网络通信、GUI和IO等功能。 1. 首先创建一个Car类,表示汽车: ```java public class Car { private String id; // 汽车编号 private String name; // 汽车名称 private String type; // 汽车类型 private double price; // 汽车租金 private boolean isRented; // 汽车是否已经租出 public Car(String id, String name, String type, double price) { this.id = id; this.name = name; this.type = type; this.price = price; this.isRented = false; } // getter和setter方法 // ... } ``` 2. 然后创建一个CarRentalSystem类,表示租车系统,其中包含了所有可租的汽车,以及租车和还车的功能: ```java import java.util.ArrayList; import java.util.List; public class CarRentalSystem { private List<Car> cars; // 所有可租的汽车列表 public CarRentalSystem() { this.cars = new ArrayList<>(); // 初始化所有可租的汽车 cars.add(new Car("001", "奔驰", "豪华车", 500.0)); cars.add(new Car("002", "宝马", "豪华车", 450.0)); cars.add(new Car("003", "别克", "商务车", 300.0)); cars.add(new Car("004", "雪佛兰", "家庭车", 200.0)); cars.add(new Car("005", "丰田", "家庭车", 180.0)); } // 获取所有可租的汽车列表 public List<Car> getCars() { return cars; } // 根据编号查找汽车 public Car findCarById(String id) { for (Car car : cars) { if (car.getId().equals(id)) { return car; } } return null; } // 租车 public synchronized boolean rentCar(String id) { Car car = findCarById(id); if (car != null && !car.isRented()) { car.setRented(true); return true; } return false; } // 还车 public synchronized boolean returnCar(String id) { Car car = findCarById(id); if (car != null && car.isRented()) { car.setRented(false); return true; } return false; } } ``` 3. 接下来创建一个客户端界面,包含租车和还车的操作: ```java import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.List; public class CarRentalClient extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; private JTextArea taInfo; // 显示租车信息 private JButton btnRent; // 租车按钮 private JButton btnReturn; // 还车按钮 private JComboBox<String> cbCars; // 可租的汽车列表 private CarRentalSystem rentalSystem; // 租车系统 private Socket socket; // 与服务器连接的套接字 private BufferedReader reader; // 从服务器读取数据的输入流 private PrintWriter writer; // 向服务器发送数据的输出流 public CarRentalClient() { setTitle("租车系统客户端"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 600, 400); setLayout(new BorderLayout()); taInfo = new JTextArea(); add(new JScrollPane(taInfo), BorderLayout.CENTER); JPanel panel = new JPanel(); add(panel, BorderLayout.SOUTH); rentalSystem = new CarRentalSystem(); List<Car> cars = rentalSystem.getCars(); String[] carNames = new String[cars.size()]; for (int i = 0; i < cars.size(); i++) { carNames[i] = cars.get(i).getName() + " (" + cars.get(i).getId() + ")"; } cbCars = new JComboBox<>(carNames); panel.add(cbCars); btnRent = new JButton("租车"); btnRent.addActionListener(this); panel.add(btnRent); btnReturn = new JButton("还车"); btnReturn.addActionListener(this); panel.add(btnReturn); setVisible(true); connectToServer(); } // 连接到服务器 private void connectToServer() { try { socket = new Socket("localhost", 8888); reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); writer = new PrintWriter(socket.getOutputStream(), true); new Thread(new ServerListener()).start(); } catch (Exception e) { taInfo.append("连接服务器失败:" + e.getMessage() + "\n"); } } // 处理按钮事件 @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == btnRent) { String carId = rentalSystem.getCars().get(cbCars.getSelectedIndex()).getId(); writer.println("rent," + carId); } else if (e.getSource() == btnReturn) { String carId = rentalSystem.getCars().get(cbCars.getSelectedIndex()).getId(); writer.println("return," + carId); } } // 从服务器读取信息的线程 private class ServerListener implements Runnable { @Override public void run() { try { while (true) { String msg = reader.readLine(); if (msg != null) { String[] parts = msg.split(","); if (parts.length == 2) { String action = parts[0]; String carId = parts[1]; if (action.equals("rent")) { boolean success = rentalSystem.rentCar(carId); if (success) { taInfo.append("租车成功!\n"); } else { taInfo.append("租车失败!\n"); } } else if (action.equals("return")) { boolean success = rentalSystem.returnCar(carId); if (success) { taInfo.append("还车成功!\n"); } else { taInfo.append("还车失败!\n"); } } } } } } catch (Exception e) { taInfo.append("与服务器连接断开:" + e.getMessage() + "\n"); } } } public static void main(String[] args) { new CarRentalClient(); } } ``` 4. 最后创建一个服务器程序,处理租车和还车的请求: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class CarRentalServer { private static CarRentalSystem rentalSystem = new CarRentalSystem(); public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(8888); System.out.println("服务器已启动,等待客户端连接..."); while (true) { Socket socket = serverSocket.accept(); new Thread(new ClientHandler(socket)).start(); } } catch (Exception e) { e.printStackTrace(); } } // 处理客户端请求的线程 private static class ClientHandler implements Runnable { private Socket socket; private BufferedReader reader; private PrintWriter writer; public ClientHandler(Socket socket) throws Exception { this.socket = socket; this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); this.writer = new PrintWriter(socket.getOutputStream(), true); } @Override public void run() { try { while (true) { String msg = reader.readLine(); if (msg != null) { String[] parts = msg.split(","); if (parts.length == 2) { String action = parts[0]; String carId = parts[1]; if (action.equals("rent")) { boolean success = rentalSystem.rentCar(carId); if (success) { writer.println("rent," + carId); } else { writer.println("rent_fail," + carId); } } else if (action.equals("return")) { boolean success = rentalSystem.returnCar(carId); if (success) { writer.println("return," + carId); } else { writer.println("return_fail," + carId); } } } } } } catch (Exception e) { System.out.println("客户端断开连接:" + e.getMessage()); } finally { try { reader.close(); writer.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); } } } } } ``` 这个租车App的实现比较简单,仅供参考。实际上,一个完整的租车系统还需要考虑更多的功能,比如用户注册、登录、结算等等。

相关推荐

最新推荐

recommend-type

Java Web项目中使用Socket通信多线程、长连接的方法

很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听。接下来通过本文给大家介绍Java Web项目中使用Socket通信多线程、长连接的...
recommend-type

基于GUI的网络通信程序设计.docx

实验二 基于GUI的网络通信程序设计 一.实验目的 1.掌握Java中GUI程序的编写,包括事件监听机制。 2.掌握Java的网络通信编程,ServerSocket,Socket类的使用。 3.掌握Java中多线程的编程,Thread类,Runnable...
recommend-type

Java模拟多线程实现抢票代码实例

主要介绍了Java模拟多线程实现抢票,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
recommend-type

Java创建多线程异步执行实现代码解析

主要介绍了Java创建多线程异步执行实现代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
recommend-type

Java多线程之多线程异常捕捉

在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked exception处理掉,通过此篇文章给大家分享Java多线程之多线程异常捕捉,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。