基于TCP简单的购票系统

来源:互联网 发布:金策大数据分析系统 编辑:程序博客网 时间:2024/05/15 22:06

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.net.Socket;
import java.net.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.net.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.net.InetAddress;
import java.net.ServerSocket;
import java.net.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>