




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Java網(wǎng)絡(luò)編程報(bào)告姓名: 蔣怡 學(xué)號(hào): 1107300134 題目: 模擬火車(chē)售票退票系統(tǒng) 一、作業(yè)要求:模擬火車(chē)售票退票系統(tǒng)實(shí)現(xiàn)一個(gè)服務(wù)器為多個(gè)客戶(hù)服務(wù),要求1、 服務(wù)器用線程池,線程容量為4,座位數(shù)為60個(gè),即01-60號(hào)座.2、 客戶(hù)通過(guò)網(wǎng)絡(luò)發(fā)送請(qǐng)求可以退票可以買(mǎi)票,先來(lái)先服務(wù),買(mǎi)票還是退票由隨機(jī)數(shù)決定,退票必須是該用戶(hù)買(mǎi)過(guò)的有效票,先買(mǎi)的票先退。若退票時(shí)該用戶(hù)已沒(méi)有買(mǎi)到的票,則改為買(mǎi)票。若服務(wù)器票已售完,則需等待,先來(lái)先服務(wù),哪個(gè)客戶(hù)先來(lái),服務(wù)器將先為哪個(gè)客戶(hù)服務(wù)。3、 服務(wù)器每次接收一個(gè)客戶(hù)請(qǐng)求需打印該客戶(hù)的端口號(hào)、IP和該用戶(hù)是買(mǎi)票還是退票,處理該請(qǐng)求之前目前剩余的票所有座號(hào),處
2、理之后剩余的座號(hào)也要打印出來(lái),并延遲一個(gè)隨機(jī)處理時(shí)間,以模擬對(duì)每個(gè)客戶(hù)處理的時(shí)間不同。將處理結(jié)果發(fā)給客戶(hù)。4、 客戶(hù)收到結(jié)果后打印到屏幕。5、 注意資源共享的問(wèn)題,適當(dāng)時(shí)可用同步代碼,不允許用同步方法。注意線程之間的協(xié)作。演示時(shí)開(kāi)放4-5個(gè)用戶(hù),并演示一次退票無(wú)效的情況(即要退的票在服務(wù)器中還沒(méi)有賣(mài)出去,要求2是正常情況)2、 主要設(shè)計(jì)思路:1、該程序包括以下幾個(gè)類(lèi):1)、EchoClient.java2)、EchoServer.java3)、Node.java 定義了線性表的一個(gè)節(jié)點(diǎn)的結(jié)構(gòu),并對(duì)節(jié)點(diǎn)進(jìn)行初始化4)、LList.java 接口類(lèi),包含以下幾個(gè)方法: boolean isEmpt
3、y(); / 判斷線性表是否為空 int length(); / 返回線性表長(zhǎng)度 T get(int i); / 返回第i(i>0)個(gè)元素 void insert(int i,T x); / 插入x作為第i個(gè)元素 void insert1(T x); /按順序插入一個(gè)數(shù)到鏈表中 T remove(int i); / 刪除第i個(gè)元素并返回被刪對(duì)象 void append(T x); / 在線性表最后插入x元素5)、SingleLinkList.java 實(shí)現(xiàn)接口LList。6)、Customer.java 定義了choise,cus_tickets兩個(gè)屬性和choice()方法,其中 ch
4、oise是一個(gè)隨機(jī)產(chǎn)生的0或1,用來(lái)決定客戶(hù)買(mǎi)票或退票。 cus_list是一個(gè)線性表,用來(lái)存儲(chǔ)客戶(hù)所買(mǎi)到的所有票。7)、Tickets.java定義了number和list兩個(gè)屬性,其中number用來(lái)表示服務(wù)器售出的票號(hào),list是一個(gè)線性表,用來(lái)存儲(chǔ)剩余火車(chē)票。包含了售票票方法sell()和退票方法return_ticket()。2、 思路及流程圖 1)、首先客戶(hù)端通過(guò)調(diào)用Customer類(lèi)的choice()方法,由choice()方法來(lái)決定客戶(hù)是買(mǎi)票還是退票。若choise=1,則客戶(hù)買(mǎi)票,若choise=0,則客戶(hù)退票。流程圖如下:客戶(hù)買(mǎi)票choice=(int)(Math.rand
5、om()*2)choise=1客戶(hù)退票票是否2) 、若客戶(hù)買(mǎi)票,則通過(guò)輸出流將買(mǎi)票信息發(fā)送給服務(wù)器端。若客戶(hù)退票,則通過(guò)“customer.cus_list.isEmpty()”這個(gè)語(yǔ)句判斷客戶(hù)是否有票可退,若客戶(hù)有票可退,則通過(guò)輸出流將退票信息及所退票號(hào)發(fā)送給服務(wù)器端;若客戶(hù)無(wú)票可退,則改為買(mǎi)票,通過(guò)輸出流將信息發(fā)送給服務(wù)器端。流程圖如下:否是客戶(hù)退票客戶(hù)擁有的票是否為空發(fā)送退票信息給服務(wù)器端發(fā)送買(mǎi)票信息給服務(wù)器端客戶(hù)買(mǎi)票發(fā)送買(mǎi)票信息給服務(wù)器端3) 、服務(wù)器端通過(guò)輸入流接收客戶(hù)端的信息,接收信息后,隨機(jī)產(chǎn)生一個(gè)時(shí)間,線程休眠,模擬網(wǎng)絡(luò)延遲。然后判斷客戶(hù)是買(mǎi)票還是退票,若是買(mǎi)票,則調(diào)用Tick
6、ets類(lèi)中的sell()方法進(jìn)行售票處理;若是退票,則調(diào)用Tickets類(lèi)中的return_ticket()方法進(jìn)行退票處理。流程圖如下:接收客戶(hù)端的信息線程休眠一段時(shí)間客戶(hù)是否買(mǎi)票tickets.sell()Tickets.return _ticket()否是4)、若客戶(hù)是買(mǎi)票的,則通過(guò)“l(fā)ist.isEmpty()”判斷是否有票可售,若有票可售,則進(jìn)行售票處理(即將list線性表中的第一個(gè)節(jié)點(diǎn)刪除,表示此票已售出),處理后將信息反饋給客戶(hù);客戶(hù)收到服務(wù)器端的信息后,將反饋信息打印輸出,同時(shí)將所買(mǎi)到的票添加到cus_list線性表的最后。若無(wú)票可售,則線程等待,將線程加入等待隊(duì)列,當(dāng)線程被喚
7、醒后,進(jìn)行售票處理,處理后將信息反饋給客戶(hù)??蛻?hù)收到服務(wù)器端的信息后,輸出反饋的信息,同時(shí),將所買(mǎi)到的票添加到cus_list線性表的最后??蛻?hù)收到服務(wù)器端反饋信息打印輸出信息cus_list.append()否是否有票可售售票處理是售票線程等待線程被喚醒后進(jìn)行售票處理將線程加入等待隊(duì)列將反饋信息發(fā)送到客戶(hù)端5) 、若客戶(hù)是退票的,首先判斷客戶(hù)所退的票是否是已售出的票,若不是,則非法退票,退票失敗,將反饋信息發(fā)送給客戶(hù)端;若是,則進(jìn)行退票處理(將所要退的票按大小添加到線性表list中),退票處理后,將反饋信息發(fā)送給客戶(hù)端,然后該線程將已經(jīng)退了的票從cus_list中刪除(即cus_list.r
8、emove())。判斷是否有線程在等待隊(duì)列中,若有,則將隊(duì)列中的第一個(gè)線程喚醒,進(jìn)行售票處理,然后將反饋信息發(fā)送給客戶(hù)端。退票是否成功打印輸出退票成功信息cus_list.remove()是輸出退票失敗信息客戶(hù)端收到服務(wù)器端的反饋信息否等待隊(duì)列是否空退票該票是否已售出否非法退票,退票失敗是退票處理將所退的票售給第一個(gè)等待的線程將反饋信息發(fā)送到客戶(hù)端3、 關(guān)鍵代碼for(i=1;i<=500;i+) System.out.println("客戶(hù)第"+i+"次請(qǐng)求");/ msg=customer.choice(); /choice產(chǎn)生隨機(jī)數(shù)來(lái)確定客戶(hù)
9、是買(mǎi)票還是退票 if(msg.equals("buy") pw.println(msg); /將客戶(hù)買(mǎi)票的信息傳給服務(wù)器 System.out.println(br.readLine();/輸出服務(wù)器傳給客戶(hù)的買(mǎi)到票的信息 customer.cus_list.append(br.readLine(); /將客戶(hù)買(mǎi)到的票放入鏈表的最后 System.out.println(customer.cus_list+"n");/輸出客戶(hù)所擁有的所有票,cus_list:用一個(gè)鏈表存儲(chǔ)客戶(hù)所擁有的所有票 else if(msg.equals("refund
10、") if(!customer.cus_list.isEmpty() /若客戶(hù)所擁有的票不是空的,就退票 pw.println(msg); /將客戶(hù)退票的信息傳給服務(wù)器 pw.println(cus_number=customer.cus_list.get(1); /獲取客戶(hù)最先買(mǎi)到的那張票,將其傳給服務(wù)器 msg=br.readLine();/接收服務(wù)器的反饋信息 if(!msg.equals("非法退票!退票失敗!") System.out.println(msg); customer.cus_list.remove(1); /將客戶(hù)所退了的票從客戶(hù)所擁有的票
11、中移除 System.out.println(customer.cus_list+"n"); /輸出客戶(hù)所擁有的所有票 else System.out.println(msg); else/否則,轉(zhuǎn)為買(mǎi)票 System.out.println("客戶(hù)沒(méi)有票可退,轉(zhuǎn)為買(mǎi)票"); pw.println("buy");/將買(mǎi)票信息傳給服務(wù)器 System.out.println(br.readLine();/輸出服務(wù)器傳給客戶(hù)的買(mǎi)到票的信息 customer.cus_list.append(br.readLine(); /將客戶(hù)買(mǎi)到的票放入
12、鏈表的最后 System.out.println(customer.cus_list+"n");/輸出客戶(hù)所擁有的所有票,cus_list:用一個(gè)鏈表存儲(chǔ)客戶(hù)所擁有的所有票 1)、EchoClient.javapublic class EchoServer private int port=8001; private ServerSocket serverSocket; private ExecutorService executorService; /線程池 private final int POOL_SIZE=4; /單個(gè)CPU時(shí)線程池中工作線程的數(shù)目 List<
13、;Socket> socketList=new ArrayList<Socket>(); /排隊(duì)序列 public EchoServer() throws IOException serverSocket = new ServerSocket(port);serverSocket.setReceiveBufferSize(50); /創(chuàng)建線程池 executorService= Executors.newFixedThreadPool( POOL_SIZE); System.out.println("服務(wù)器啟動(dòng)"); public void service
14、() while (true) Socket socket=null; try socket = serverSocket.accept(); executorService.execute(new Handler(socket,socketList); catch (IOException e) e.printStackTrace(); public static void main(String args)throws IOException new EchoServer().service(); class Handler implements Runnable private Sock
15、et socket; private Tickets ticket=new Tickets(); List<Socket> socketList=new ArrayList<Socket>(); /排隊(duì)序列 public Handler(Socket socket,List<Socket> socketList) this.socket=socket; this.socketList=socketList; private PrintWriter getWriter(Socket socket)throws IOException OutputStream
16、socketOut = socket.getOutputStream();return new PrintWriter(socketOut,true);2) 、EchoServer.java private BufferedReader getReader(Socket socket)throws IOException InputStream socketIn = socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn); public String echo(String msg)
17、return "echo:" + msg; SuppressWarnings("static-access")public void run() try System.out.println("New connection accepted " + socket.getInetAddress() + ":" +socket.getPort(); BufferedReader br =getReader(socket); PrintWriter pw = getWriter(socket); String msg =
18、 null; String cus_number=null; while (msg=br.readLine() != null) / 模擬售票的網(wǎng)絡(luò)延遲 try Thread.sleep(long) (Math.random()*3000); /產(chǎn)生一個(gè)隨機(jī)處理時(shí)間 catch (InterruptedException e) e.printStackTrace(); if(msg.equals("buy") ticket.sell(socketList,socket,pw); else if(msg.equals("refund") ticket.re
19、turn_ticket(cus_number=br.readLine(),socket,socketList,pw); catch (IOException e) e.printStackTrace(); finally try if(socket!=null)socket.close(); catch (IOException e) e.printStackTrace(); public class Tickets String number;/售出票的序號(hào) static String tickets="1","2","3",&qu
20、ot;4","5","6","7","8","9","10", "11","12","13","14","15","16","17","18","19","20", "21","22","23","2
21、4","25","26","27","28","29","30", "31","32","33","34","35","36","37","38","39","40", "41","42","43","
22、;44","45","46","47","48","49","50", "51","52","53","54","55","56","57","58","59","60" static SingleLinkList<String> list = new Si
23、ngleLinkList<String>(tickets); /用list鏈表存儲(chǔ)火車(chē)票 public void sell(List<Socket> socketList,Socket socket,PrintWriter pw ) synchronized (list) System.out.println(socket.getPort()+"客戶(hù)買(mǎi)票"); System.out.print("客戶(hù)買(mǎi)票前剩余火車(chē)票為:"); System.out.println(this.list); /打印還剩多少?gòu)埰笨少u(mài) if(list.i
24、sEmpty()/若無(wú)票可售,則將線程加入等待隊(duì)列 System.out.println("暫時(shí)無(wú)票!排隊(duì)中."); socketList.add(socket); System.out.println("客戶(hù):"+socket.getInetAddress()+":"+socket.getPort()+",隊(duì)列長(zhǎng)度:"+socketList.toArray().length); System.out.println("等待隊(duì)列的第一個(gè)客戶(hù)為:"+socketList.get(0).getPor
25、t()+"n"); try list.wait(); catch (InterruptedException e) / TODO Auto-generated catch block e.printStackTrace(); number=list.remove(1); System.out.println("票號(hào):"+number+"被隊(duì)首:"+socketList.get(0).getPort()+"預(yù)定成功n"); socketList.remove(0); pw.println("客戶(hù)買(mǎi)到的票的票
26、號(hào)為:"+number);/將客戶(hù)買(mǎi)到票的信息傳回給客戶(hù) pw.println(number); /將客戶(hù)買(mǎi)到的票號(hào)傳給客戶(hù) else /若符合條件進(jìn)行售票 number=list.remove(1); /每次票號(hào)最小的票售出,將已售出的票從火車(chē)票鏈表中移除 System.out.println("售出票的序號(hào)為" + number );/打印售出票的信息 System.out.print("客戶(hù)買(mǎi)票后剩余火車(chē)票為:"); System.out.println(list+"n");/打印售票后所剩余的火車(chē)票 pw.println("客戶(hù)買(mǎi)到的票的票號(hào)為:"+number);/將客戶(hù)買(mǎi)到票的信息傳回給客戶(hù) pw.println(number); /將客戶(hù)買(mǎi)到的票號(hào)傳給客戶(hù) 3) 、Tickets.java public void return_ticket(String cus_number,Socket socket,List<Socket> socketList,PrintWriter pw) /將客戶(hù)所退的票按順序添加的票號(hào)里面 synchronized (list) int i; for(i=1;i<=list
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年櫻花洗液行業(yè)深度研究分析報(bào)告
- 2025年大棚種植基地灌溉系統(tǒng)承包合同
- 2025年魚(yú)塘承包經(jīng)營(yíng)權(quán)評(píng)估與流轉(zhuǎn)合同范本
- 2025-2030年中國(guó)倍速鏈生產(chǎn)線項(xiàng)目投資可行性研究分析報(bào)告
- 中國(guó)云南省在線旅游行業(yè)發(fā)展監(jiān)測(cè)及發(fā)展戰(zhàn)略規(guī)劃報(bào)告
- 房子回收合同范本
- 2025年度周轉(zhuǎn)材料租賃與智能化管理合同
- 網(wǎng)絡(luò)寵物合同范本
- 腦服康行業(yè)深度研究報(bào)告
- 2025年中國(guó)反鏟挖掘機(jī)市場(chǎng)運(yùn)行動(dòng)態(tài)及行業(yè)投資潛力預(yù)測(cè)報(bào)告
- Illustrator設(shè)計(jì)教案(第一講)課件
- 我國(guó)的雙重國(guó)籍問(wèn)題研究 邊防管理專(zhuān)業(yè)
- 廣東義務(wù)教育標(biāo)準(zhǔn)化學(xué)校
- 全電發(fā)票樣式
- (完整)藥劑學(xué)教案
- 提案改善課件全員版
- 2022年全國(guó)新高考Ⅰ卷:馮至《江上》
- 銅陵油庫(kù)重油罐區(qū)工藝設(shè)計(jì)
- 質(zhì)量手冊(cè)CCC認(rèn)證完整
- DB51∕T 2767-2021 安全生產(chǎn)風(fēng)險(xiǎn)分級(jí)管控體系通則
- 反興奮劑考試試題與解析
評(píng)論
0/150
提交評(píng)論