简单的购票系统"/>
基于TCP简单的购票系统
1.包结构
2.源代码
2.1 Clear类 import java.awt.AWTException;import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.io.Serializable;
public class Clear implements Serializable{
public static void clear() {//清除屏幕内容
Robot r;
try {
r = new Robot();
r.mousePress(InputEvent.BUTTON3_MASK); // 按下鼠标右键
r.mouseRelease(InputEvent.BUTTON3_MASK); // 释放鼠标右键
r.keyPress(KeyEvent.VK_CONTROL); // 按下Ctrl键
r.keyPress(KeyEvent.VK_R); // 按下R键
r.keyRelease(KeyEvent.VK_R); // 释放R键
r.keyRelease(KeyEvent.VK_CONTROL); // 释放Ctrl键
r.delay(100);
} catch (AWTException e) {
e.printStackTrace();
}
}
}
2.1 DomXml类
package com.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document; import org.w3c.dom.Element;
import org.w3c.dom.Node; import org.w3c.dom.NodeList;
/**
* 读取XML文档
* @author 郑宏权
*
*/
public class DomXml implements Serializable{
//创建一个List集合存储Files对象
List<Files> xml=new ArrayList<Files>();
private static final DomXml dom=new DomXml();
public static DomXml getDom() {
return dom;
}
//返回一个List<Files>集合
public List<Files> getList(){
return xml;
}
//使用构造方法给集合List添加Files对象
public DomXml() {
try {
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc=builder.parse("Movie.xml");
NodeList list=doc.getElementsByTagName("Movie");
int id=0;
for(int i=0;i<list.getLength();i++) {
String Name=null;
String Poster=null;
String Director=null;
String Actor=null;
String Type=null;
String Price=null;
String Item=null;
//通过父节点拿到子节点集合
NodeList num=list.item(i).getChildNodes();
for(int j=0;j<num.getLength();j++) {
Node node=num.item(j);
//拿到该节点的名称
String name=node.getNodeName();
//拿到节点的文本值
String text=node.getTextContent();
if(name.equals("Name")) {
Name=text;
}
if(name.equals("Poster")) {
Poster=text;
}
if(name.equals("Director")) {
Director=text;
}
if(name.equals("Acotr")) {
Actor=text;
}
if(name.equals("Type")) {
Type=text;
}
if(name.equals("Price")) {
Price=text;
}
if(name.equals("Schedule")) {
NodeList nodes=node.getChildNodes();
for(int k=0;k<nodes.getLength();k++) {
Node child=nodes.item(k);
if(child instanceof Element) {
id++;
Element chedule=(Element)child;
Files files=new Files(id, Name, Poster, Director,
Actor, Type, Price, chedule.getTextContent());
xml.add(files);
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.3 Files类 package com.model;
import java.io.Serializable;
/**
* 存储XML
* @author 郑宏权
*
*/
public class Files implements Serializable{
private int id;//序号
private String Name;//电影名称
private String Poster;//英文名
private String Director;//导演
private String Actor;//演员
private String Type;//电影类型
private String Price;//价格
private String Item;//放映时间
//通过构造方法赋值
public Files(int id, String name, String poster, String director, String actor, String type, String price,
String item) {
super();
this.id = id;
Name = name;
Poster = poster;
Director = director;
Actor = actor;
Type = type;
Price = price;
Item = item;
}
public int getId() {
return id;
}
public String getName() {
return Name;
}
public String getPoster() {
return Poster;
}
public String getDirector() {
return Director;
}
public String getActor() {
return Actor;
}
public String getType() {
return Type;
}
public String getPrice() {
return Price;
}
public String getItem() {
return Item;
}
}
2.4 MovieFactory类 package com.model;
import java.io.Serializable;
import java.util.List;
import java.util.Scanner;
/**
* 电影工厂
* @author 郑宏权
*
*/
public class MovieFactory implements Serializable {
//定义一个List<Files>集合
List<Files> list=null;
//声明一个Files类型变量
Ticket ticket = new Ticket();
Files index = null;
String name = null;
String time = null;
//使用构造方法对list进行赋值
public MovieFactory() {
list=DomXml.getDom().getList();
}
//界面
public void menu() {
Scanner input=new Scanner(System.in);
boolean b=true;//用于跳出循环
String index;//用于选择
while(b) {
System.out.println("1.查看所有电影\t2.按电影名查询\t3.按播放时间查询\t4.购票\t5.退出;\n请选择:");
index = input.next();
Clear.clear();
if(index.equals("1")) {
this.getAll();
b=false;
}else if(index.equals("2")) {
this.getName();
b=false;
}else if(index.equals("3")) {
this.getTime();
b=false;
}else if(index.equals("4")) {
this.getTicket();
b=false;
}else if(index.equals("5")) {
System.out.println("谢谢使用");
System.exit(0);
b=false;
}else {
System.out.println("输入错误!请重新输入");
}
}
}
// 输出电影的详细信息
public void showInfo(Files s){
System.out.println(s.getId()+"\t"
+s.getName()+"\t"
+s.getPoster()+"\t"
+s.getDirector()+"\t"
+s.getActor()+"\t"
+s.getType()+"\t"
+s.getPrice()+"\t"
+s.getItem());
index=null;
}
//查看所有电影
public void getAll() {
System.out.println("序号"+"\t"+"电影名称"+"\t"+"英文名称"+"\t"+"导演"+"\t"+"演员"+"\t"+"影片类型"+"\t"+"票价"+"\t"+"播放时间");
for(Files s:list) {
this.showInfo(s);
}
System.out.println("-----------------------------------------------------------");
this.menu();
}
//电影名称查看
public void getName() {
Scanner input=new Scanner(System.in);
System.out.println("请输入电影名称:");
name = input.next();
System.out.println("序号"+"\t"+"电影名称"+"\t"+"英文名称"+"\t"+"导演"+"\t"+"演员"+"\t"+"影片类型"+"\t"+"票价"+"\t"+"播放时间");
for(Files s:list) {
if(name.equals(s.getName())||name.equals(s.getPoster()))
index=s;
if(index!=null) {
this.showInfo(index);
}
}
System.out.println("-----------------------------------------------------------");
this.menu();
}
//播放时间查看
public void getTime() {
Scanner input=new Scanner(System.in);
System.out.println("请输入电影播放时间:");
time = input.next();
System.out.println("序号"+"\t"+"电影名称"+"\t"+"英文名称"+"\t"+"导演"+"\t"+"演员"+"\t"+"影片类型"+"\t"+"票价"+"\t"+"播放时间");
for(Files s:list) {
if(time.equals(s.getItem()))
index=s;
if(index!=null) {
this.showInfo(index);
}
}
System.out.println("-----------------------------------------------------------");
this.menu();
}
//购票
public void getTicket() {
ticket.buyTicket();
this.menu();
}
}
2.5 Seat类 package com.model;
import java.io.Serializable;
import java.util.*;
/**
* 添加座位数
* @author 郑宏权
*
*/
public class Seat implements Serializable{
//创建一个座位集合表(每场电影一个表)
HashMap<String,List<String>> map=new HashMap<String,List<String>>();
public Seat() {
List<Files> list=DomXml.getDom().xml;
for(int i=1;i<=list.size();i++) {
String id=String.valueOf(i);
List<String> str=new ArrayList<String>();
for(int k=1;k<8;k++) {
for(int j=1;j<8;j++) {
str.add(k+"-"+j);
}
}
map.put(id, str);
}
}
}
2.6 Ticket类
package com.model;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;
/**
* 购票类
* @author 郑宏权
*
*/
public class Ticket implements Serializable{
private String name=null;//电影名称
private String time=null;//电影时间
private String seat=null;//座位数
private String price=null;//票价
Seat se=new Seat();//创建座位对象
HashMap<String,List<String>> map=null;//通过电影序号,得到电影座位表
public Ticket() {
map=se.map;
}
public void buyTicket() {//购票
boolean b=true;//用于跳出循环
String index;//用于选择
Scanner input=new Scanner(System.in);
while(b) {
System.out.println("1.普通票(全额)\t2.学生票(5折)\t3.赠票(免费)");
System.out.print("请选择:");
index = input.next();
Clear.clear();
if(index.equals("1")) {
this.buyOrdinary();
b=false;
}else if(index.equals("2")) {
this.buyStudent();
b=false;
}else if(index.equals("3")) {
this.free();
b=false;
}else {
System.out.println("输入错误!请重新输入");
}
}
name = null;
time = null;
seat = null;
price = null;
}
public void buyOrdinary(){// 普通票
int i=this.estimate();
if(i==1) {
System.out.println("***************************");
System.out.println("\t宏权影院\t\t");
System.out.println("---------------------------");
System.out.println(" 电影名称:"+name);
System.out.println(" 电影时间:"+time);
System.out.println(" 电影票价:"+price+"元");
System.out.println(" 电影座位:"+seat);
System.out.println("***************************");
System.out.println("购票成功!");
this.printTicket(1,price);
}else{
System.out.println("购票失败!");
}
}
public void buyStudent(){// 学生票
int i=this.estimate();
if(i==1) {
Double d = null;
if(price!=null){
d =new Double(price);
d = d*0.5;
}
System.out.println("***************************");
System.out.println("\t宏权影院(学生票)\t\t");
System.out.println("---------------------------");
System.out.println(" 电影名称:"+name);
System.out.println(" 电影时间:"+time);
System.out.println(" 电影票价:"+d.toString()+"元");
System.out.println(" 电影座位:"+seat);
System.out.println("***************************");
System.out.println("购票成功!");
this.printTicket(2,d.toString());
}else{
System.out.println("购票失败!");
}
}
public void free(){// 免票
int i=this.estimate();
Scanner input=new Scanner(System.in);
if(i==1) {
System.out.println("请输入姓名:");
String names = input.next();
System.out.println("***************************");
System.out.println("\t宏权影院(免票)\t\t");
System.out.println("---------------------------");
System.out.println(" 电影名称:"+name);
System.out.println(" 电影时间:"+time);
System.out.println(" 电影座位:"+seat);
System.out.println(" 持票姓名:"+names);
System.out.println("***************************");
System.out.println("购票成功!");
this.printTicket(3,names);
}else{
System.out.println("购票失败!");
}
}
public int estimate(){//选片选坐
Scanner input=new Scanner(System.in);
System.out.println("请输入电影序号:");
String id=input.next();
Clear.clear();
List<Files> list = DomXml.getDom().getList();
for (Files s : list) {
if(id.equals(String.valueOf(s.getId()))){
name = s.getName();
time = s.getItem();
price = s.getPrice();
System.out.println("-----------------------屏幕-------------------------");
for (int i = 0; i < map.get(id).size(); i++) {
System.out.print(map.get(id).get(i)+"\t");
if(i==6||i==13||i==20||i==27||i==34||i==41||i==49){
System.out.println();
}
}
System.out.println("\n请输入座位号,请在上图选择:");
String nums = input.next();
Clear.clear();
if(map.get(id).indexOf(nums)!=-1&&!map.get(id).get(map.get(id).indexOf(nums)).equals("已售")) {
seat=map.get(id).get(map.get(id).indexOf(nums));
map.get(id).set(map.get(id).indexOf(seat),"已售");
return 1;
}else {
System.out.println("次座位已售或输入有误");
return 0;
}
}
}
if(name==null && time==null && seat==null && price==null){
System.out.println("<该电影不存在>");
return 0;
}
return 0;
}
public void printTicket(int i,String s) {
//1.找目标文件
File file = new File("ticket.txt");
//2.创建一个通道,(如果不存在路径中的文件,则会在这一步创建的文件)
//new FileOutputStream(file,true); /true表示在原来文本的基础上写入文本(反之则会先清空再写入)
FileOutputStream outputStream;
try {
outputStream = new FileOutputStream(file,false);
String str1=null;
String str2=null;
if(i==1) {
str1="\t\t##宏权影院##\t\t\n";
str2="\t\t电影票价:\t"+s+"元\n";
}
if(i==2) {
str1="\t\t##宏权影院(学生票)##\t\t\n";
str2="\t\t电影票价:\t"+s+"元\n";
}
if(i==3) {
str1="\t\t##宏权影院(免票)##\t\t\n";
str2="\t\t持票姓名:\t"+s+"\n";
}
//3.创键一个字节数组
String str =
"***************************\n"
+str1
+"---------------------------\n"
+"\t\t电影名称:\t"+name+"\n"
+"\t\t电影时间:\t"+time+"\n"
+str2
+"\t\t电影座位:\t"+seat+"\n"
+"***************************";
//将字符串变为字节数组
byte[] b = str.getBytes();
//4.写入数据
outputStream.write(b);
//5.关闭资源
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.7 User类 package com.model;
import java.io.Serializable;
public class User implements Serializable {
private int id;
private String name;
private String password;
public User(int id, String name, String password) {
super();
this.id = id;
this.name = name;
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password+ "]";
}
}
2.8 Client类
package simpleSocketClient;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.Socket;
import java.UnknownHostException;
import com.model.MovieFactory;
import com.model.User;
/**
* 基于TCP协议的Socket通信,实现用户登录购买电影票-客户端
*/
public class Client implements Serializable{
public static void main(String[] args) {
// 1.创建客户端的Socket,指定服务器的IP和端口
try {
Socket socket = new Socket("127.0.0.1", 9999);
// 2.获取该Socket的输出流,用来向服务器发送信息
OutputStream os = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(new User(1, "root", "123456"));
socket.shutdownOutput();
String infoString=null;
// 3.获取输入流,取得服务器的信息
InputStream is = socket.getInputStream();
ObjectInputStream ois=new ObjectInputStream(is);
try {
MovieFactory f = (MovieFactory) ois.readObject();
f.menu();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
socket.shutdownInput();
oos.close();
os.close();
is.close();
ois.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.9ServerHandleThread类
package simpleSocketServer;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.Socket;
import com.model.MovieFactory;
import com.model.User;
public class ServerHandleThread implements Runnable,Serializable{
Socket socket=null;
MovieFactory factory = new MovieFactory();
public ServerHandleThread(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
OutputStream os = null;
ObjectOutputStream oos = null;
try {
InputStream is = socket.getInputStream();
ObjectInputStream ois=new ObjectInputStream(is);
//readObject()方法必须保证服务端和客户端的User包名一致,要不然会出现找不到类的错误
System.out.println("客户端发送的对象:" + (User) ois.readObject());
socket.shutdownInput();// 禁用套接字的输入流
os=socket.getOutputStream();
oos=new ObjectOutputStream(os);
oos.writeObject(factory);//将购票工厂传个客户端
oos.flush();
socket.shutdownOutput();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}finally{
try{
if(oos!=null){
oos.close();
}
if(os!=null){
os.close();
}
if(socket!=null){
socket.close();
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.10 simpleServer类
package simpleSocketServer;
import java.io.IOException;
import java.io.Serializable;
import java.InetAddress;
import java.ServerSocket;
import java.Socket;
public class simpleServer implements Serializable{
public static void main(String[] args){
try {
ServerSocket serverSocket = new ServerSocket(9999);
int count = 0;// 记录客户端的数量
System.out.println("服务器启动,等待客户端的连接。。。");
Socket socket = null;
while(true){
socket=serverSocket.accept();
++count;
Thread serverHandleThread=new Thread(new ServerHandleThread(socket));
serverHandleThread.setPriority(4);
serverHandleThread.start();
System.out.println("上线的客户端有" + count + "个!");
InetAddress inetAddress = socket.getInetAddress();
System.out.println("当前客户端的IP地址是:"+inetAddress.getHostAddress());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.11 Movie.xml
<?xml version="1.0" encoding="UTF-8"?>
<Film>
<Movie>
<Name>雷神3</Name>
<Poster>LS3</Poster>
<Director>塔伊加</Director>
<Acotr>克里斯</Acotr>
<Type>冒险</Type>
<Price>75</Price>
<Schedule>
<Item>10:00</Item>
<Item>13:00</Item>
</Schedule>
</Movie>
<Movie>
<Name>全球风暴</Name>
<Poster>QQFB</Poster>
<Director>迪安</Director>
<Acotr>杰拉德</Acotr>
<Type>灾难</Type>
<Price>90</Price>
<Schedule>
<Item>09:30</Item>
<Item>15:00</Item>
</Schedule>
</Movie>
<Movie>
<Name>密战</Name>
<Poster>MZ</Poster>
<Director>钟少雄</Director>
<Acotr>郭富城</Acotr>
<Type>谍战</Type>
<Price>120</Price>
<Schedule>
<Item>11:02</Item>
<Item>15:00</Item>
</Schedule>
</Movie>
</Film>
更多推荐
基于TCP简单的购票系统
发布评论