版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Java網(wǎng)絡(luò)編程報告姓名: 蔣怡 學(xué)號: 1107300134 題目: 模擬火車售票退票系統(tǒng) 一、作業(yè)要求:模擬火車售票退票系統(tǒng)實現(xiàn)一個服務(wù)器為多個客戶服務(wù),要求1、 服務(wù)器用線程池,線程容量為4,座位數(shù)為60個,即01-60號座.2、 客戶通過網(wǎng)絡(luò)發(fā)送請求可以退票可以買票,先來先服務(wù),買票還是退票由隨機(jī)數(shù)決定,退票必須是該用戶買過的有效票,先買的票先退。若退票時該用戶已沒有買到的票,則改為買票。若服務(wù)器票已售完,則需等待,先來先服務(wù),哪個客戶先來,服務(wù)器將先為哪個客戶服務(wù)。3、 服務(wù)器每次接收一個客戶請求需打印該客戶的端口號、IP和該用戶是買票還是退票,處理該請求之前目前剩余的票所有座號,處
2、理之后剩余的座號也要打印出來,并延遲一個隨機(jī)處理時間,以模擬對每個客戶處理的時間不同。將處理結(jié)果發(fā)給客戶。4、 客戶收到結(jié)果后打印到屏幕。5、 注意資源共享的問題,適當(dāng)時可用同步代碼,不允許用同步方法。注意線程之間的協(xié)作。演示時開放4-5個用戶,并演示一次退票無效的情況(即要退的票在服務(wù)器中還沒有賣出去,要求2是正常情況)2、 主要設(shè)計思路:1、該程序包括以下幾個類:1)、EchoClient.java2)、EchoServer.java3)、Node.java 定義了線性表的一個節(jié)點的結(jié)構(gòu),并對節(jié)點進(jìn)行初始化4)、LList.java 接口類,包含以下幾個方法: boolean isEmpt
3、y(); / 判斷線性表是否為空 int length(); / 返回線性表長度 T get(int i); / 返回第i(i>0)個元素 void insert(int i,T x); / 插入x作為第i個元素 void insert1(T x); /按順序插入一個數(shù)到鏈表中 T remove(int i); / 刪除第i個元素并返回被刪對象 void append(T x); / 在線性表最后插入x元素5)、SingleLinkList.java 實現(xiàn)接口LList。6)、Customer.java 定義了choise,cus_tickets兩個屬性和choice()方法,其中 ch
4、oise是一個隨機(jī)產(chǎn)生的0或1,用來決定客戶買票或退票。 cus_list是一個線性表,用來存儲客戶所買到的所有票。7)、Tickets.java定義了number和list兩個屬性,其中number用來表示服務(wù)器售出的票號,list是一個線性表,用來存儲剩余火車票。包含了售票票方法sell()和退票方法return_ticket()。2、 思路及流程圖 1)、首先客戶端通過調(diào)用Customer類的choice()方法,由choice()方法來決定客戶是買票還是退票。若choise=1,則客戶買票,若choise=0,則客戶退票。流程圖如下:客戶買票choice=(int)(Math.rand
5、om()*2)choise=1客戶退票票是否2) 、若客戶買票,則通過輸出流將買票信息發(fā)送給服務(wù)器端。若客戶退票,則通過“customer.cus_list.isEmpty()”這個語句判斷客戶是否有票可退,若客戶有票可退,則通過輸出流將退票信息及所退票號發(fā)送給服務(wù)器端;若客戶無票可退,則改為買票,通過輸出流將信息發(fā)送給服務(wù)器端。流程圖如下:否是客戶退票客戶擁有的票是否為空發(fā)送退票信息給服務(wù)器端發(fā)送買票信息給服務(wù)器端客戶買票發(fā)送買票信息給服務(wù)器端3) 、服務(wù)器端通過輸入流接收客戶端的信息,接收信息后,隨機(jī)產(chǎn)生一個時間,線程休眠,模擬網(wǎng)絡(luò)延遲。然后判斷客戶是買票還是退票,若是買票,則調(diào)用Tick
6、ets類中的sell()方法進(jìn)行售票處理;若是退票,則調(diào)用Tickets類中的return_ticket()方法進(jìn)行退票處理。流程圖如下:接收客戶端的信息線程休眠一段時間客戶是否買票tickets.sell()Tickets.return _ticket()否是4)、若客戶是買票的,則通過“l(fā)ist.isEmpty()”判斷是否有票可售,若有票可售,則進(jìn)行售票處理(即將list線性表中的第一個節(jié)點刪除,表示此票已售出),處理后將信息反饋給客戶;客戶收到服務(wù)器端的信息后,將反饋信息打印輸出,同時將所買到的票添加到cus_list線性表的最后。若無票可售,則線程等待,將線程加入等待隊列,當(dāng)線程被喚
7、醒后,進(jìn)行售票處理,處理后將信息反饋給客戶??蛻羰盏椒?wù)器端的信息后,輸出反饋的信息,同時,將所買到的票添加到cus_list線性表的最后。客戶收到服務(wù)器端反饋信息打印輸出信息cus_list.append()否是否有票可售售票處理是售票線程等待線程被喚醒后進(jìn)行售票處理將線程加入等待隊列將反饋信息發(fā)送到客戶端5) 、若客戶是退票的,首先判斷客戶所退的票是否是已售出的票,若不是,則非法退票,退票失敗,將反饋信息發(fā)送給客戶端;若是,則進(jìn)行退票處理(將所要退的票按大小添加到線性表list中),退票處理后,將反饋信息發(fā)送給客戶端,然后該線程將已經(jīng)退了的票從cus_list中刪除(即cus_list.r
8、emove())。判斷是否有線程在等待隊列中,若有,則將隊列中的第一個線程喚醒,進(jìn)行售票處理,然后將反饋信息發(fā)送給客戶端。退票是否成功打印輸出退票成功信息cus_list.remove()是輸出退票失敗信息客戶端收到服務(wù)器端的反饋信息否等待隊列是否空退票該票是否已售出否非法退票,退票失敗是退票處理將所退的票售給第一個等待的線程將反饋信息發(fā)送到客戶端3、 關(guān)鍵代碼for(i=1;i<=500;i+) System.out.println("客戶第"+i+"次請求");/ msg=customer.choice(); /choice產(chǎn)生隨機(jī)數(shù)來確定客戶
9、是買票還是退票 if(msg.equals("buy") pw.println(msg); /將客戶買票的信息傳給服務(wù)器 System.out.println(br.readLine();/輸出服務(wù)器傳給客戶的買到票的信息 customer.cus_list.append(br.readLine(); /將客戶買到的票放入鏈表的最后 System.out.println(customer.cus_list+"n");/輸出客戶所擁有的所有票,cus_list:用一個鏈表存儲客戶所擁有的所有票 else if(msg.equals("refund
10、") if(!customer.cus_list.isEmpty() /若客戶所擁有的票不是空的,就退票 pw.println(msg); /將客戶退票的信息傳給服務(wù)器 pw.println(cus_number=customer.cus_list.get(1); /獲取客戶最先買到的那張票,將其傳給服務(wù)器 msg=br.readLine();/接收服務(wù)器的反饋信息 if(!msg.equals("非法退票!退票失敗!") System.out.println(msg); customer.cus_list.remove(1); /將客戶所退了的票從客戶所擁有的票
11、中移除 System.out.println(customer.cus_list+"n"); /輸出客戶所擁有的所有票 else System.out.println(msg); else/否則,轉(zhuǎn)為買票 System.out.println("客戶沒有票可退,轉(zhuǎn)為買票"); pw.println("buy");/將買票信息傳給服務(wù)器 System.out.println(br.readLine();/輸出服務(wù)器傳給客戶的買到票的信息 customer.cus_list.append(br.readLine(); /將客戶買到的票放入
12、鏈表的最后 System.out.println(customer.cus_list+"n");/輸出客戶所擁有的所有票,cus_list:用一個鏈表存儲客戶所擁有的所有票 1)、EchoClient.javapublic class EchoServer private int port=8001; private ServerSocket serverSocket; private ExecutorService executorService; /線程池 private final int POOL_SIZE=4; /單個CPU時線程池中工作線程的數(shù)目 List<
13、;Socket> socketList=new ArrayList<Socket>(); /排隊序列 public EchoServer() throws IOException serverSocket = new ServerSocket(port);serverSocket.setReceiveBufferSize(50); /創(chuàng)建線程池 executorService= Executors.newFixedThreadPool( POOL_SIZE); System.out.println("服務(wù)器啟動"); 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>(); /排隊序列 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)生一個隨機(jī)處理時間 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;/售出票的序號 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鏈表存儲火車票 public void sell(List<Socket> socketList,Socket socket,PrintWriter pw ) synchronized (list) System.out.println(socket.getPort()+"客戶買票"); System.out.print("客戶買票前剩余火車票為:"); System.out.println(this.list); /打印還剩多少張票可賣 if(list.i
24、sEmpty()/若無票可售,則將線程加入等待隊列 System.out.println("暫時無票!排隊中."); socketList.add(socket); System.out.println("客戶:"+socket.getInetAddress()+":"+socket.getPort()+",隊列長度:"+socketList.toArray().length); System.out.println("等待隊列的第一個客戶為:"+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("票號:"+number+"被隊首:"+socketList.get(0).getPort()+"預(yù)定成功n"); socketList.remove(0); pw.println("客戶買到的票的票
26、號為:"+number);/將客戶買到票的信息傳回給客戶 pw.println(number); /將客戶買到的票號傳給客戶 else /若符合條件進(jìn)行售票 number=list.remove(1); /每次票號最小的票售出,將已售出的票從火車票鏈表中移除 System.out.println("售出票的序號為" + number );/打印售出票的信息 System.out.print("客戶買票后剩余火車票為:"); System.out.println(list+"n");/打印售票后所剩余的火車票 pw.println("客戶買到的票的票號為:"+number);/將客戶買到票的信息傳回給客戶 pw.println(number); /將客戶買到的票號傳給客戶 3) 、Tickets.java public void return_ticket(String cus_number,Socket socket,List<Socket> socketList,PrintWriter pw) /將客戶所退的票按順序添加的票號里面 synchronized (list) int i; for(i=1;i<=list
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家具物流配送合作協(xié)議
- 酒店客房翻新合同范本
- 游樂園翻新拆除合同范本
- 畫廊裝修合同家裝規(guī)范
- 電商配送合作協(xié)議范本
- 老廠房改造居間服務(wù)合同
- 冷鏈果汁配送服務(wù)協(xié)議
- 裝修項目驗收合同
- 學(xué)校垃圾處理運輸服務(wù)合同
- 化學(xué)原料物流外包合同模板
- 統(tǒng)編版七年級上冊 15-《 梅嶺三章》任務(wù)驅(qū)動式公開課一等獎創(chuàng)新教學(xué)設(shè)計
- 印刷服務(wù)投標(biāo)方案(技術(shù)標(biāo))
- 奧運會2024年秋季開學(xué)第一課課件
- 泰國課件完整版本
- 2024年中翼航空投資限公司應(yīng)屆畢業(yè)生招聘35人(高頻重點提升專題訓(xùn)練)共500題附帶答案詳解
- 【廣州浪奇公司存貨內(nèi)部控制缺陷的案例探析8100字(論文)】
- 口腔醫(yī)師醫(yī)患溝通技巧課件
- 勞動主題《了解志愿服務(wù)》(教學(xué)設(shè)計)-二年級勞動奧教版
- 農(nóng)業(yè)工程概論智慧樹知到期末考試答案章節(jié)答案2024年昆明理工大學(xué)
- DZ∕T 0173-2022 大地電磁測深法技術(shù)規(guī)程(正式版)
- 大班區(qū)域活動分析與調(diào)整
評論
0/150
提交評論