操作系統(tǒng)課程設(shè)計--簡單的聊天程序_第1頁
已閱讀1頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p>  操作系統(tǒng)課程設(shè)計任務(wù)書</p><p> 學(xué) 院計算機(jī)與信息工程學(xué)院專 業(yè)網(wǎng)絡(luò)工程</p><p> 課程名稱操作系統(tǒng)題 目進(jìn)程通信</p><p> 完成期限2013年6月3日-2013年6月30日共4周</p><p> 內(nèi)容及任務(wù)項(xiàng)目的目的實(shí)現(xiàn)一個簡單的聊天程序項(xiàng)目任務(wù)的主要內(nèi)容和要求(1)根據(jù)進(jìn)程

2、通信的方式和類型,以及進(jìn)程通信的實(shí)現(xiàn)方法,實(shí)現(xiàn)一個簡單的聊天程序,聊天程序包括客戶端與服務(wù)器兩部分。(2)按照要求撰寫課程設(shè)計報告。三、項(xiàng)目設(shè)計(研究)思路分析課題要求、了解進(jìn)程通信原理、設(shè)計通信界面、編寫代碼。四、具體成果形式和要求可以在一個計算機(jī)上通信,也可以在兩個計算機(jī)上通信。</p><p> 進(jìn)度安排起止日期工作內(nèi)容</p><p> 2013.6.3-2013.6.5分析課題要

3、求,找出解決方案</p><p> 2013.6.6-2013.6.25根據(jù)方案了解通信原理,對課題進(jìn)行設(shè)計</p><p> 2013.6.25-2013.6.30根據(jù)設(shè)計分析,進(jìn)行代碼編寫和測試</p><p> 主要參考資料[1]趙生慧. Java面向?qū)ο蟪绦蛟O(shè)計(第二版)[M].北京:中國水利水電出版社,2010.[2](美)卡爾弗特,多納霍,周恒民譯. J

4、ava TCP\IP Socket編程(原書第2版)[M].北京:機(jī)械工業(yè)出版社,2011.</p><p> 指導(dǎo)教師意見(簽字): 年 月 日</p><p> 系(教研室)主任意見(簽字): 年 月 日</p><p>

5、;<b>  第一部分:正文部分</b></p><p><b>  一、選題背景</b></p><p>  為了提高計算機(jī)系統(tǒng)的效率。增強(qiáng)計算機(jī)系統(tǒng)內(nèi)各種硬件的并行操作能力。操作系統(tǒng)要求程序結(jié)構(gòu)必須適應(yīng)并發(fā)處理的需要,為此引入了進(jìn)程的概念。進(jìn)程是操作系統(tǒng)的核心,所有基于多道程序設(shè)計的操作系統(tǒng)都建立在進(jìn)程的概念之上。目前的計算機(jī)系統(tǒng)均提供了多任

6、務(wù)并行環(huán)境。無論是應(yīng)用程序還是系統(tǒng)程序,都需要針對每一個任務(wù)創(chuàng)建相應(yīng)的進(jìn)程。進(jìn)程是設(shè)計和分析操作系統(tǒng)的有力工具。然而不同的進(jìn)程之間,即使是具有家族聯(lián)系的父子進(jìn)程,都具有各自不同的進(jìn)程映像。由于不同的進(jìn)程運(yùn)行在各自不同的內(nèi)存空間中,一方對于變量的修改另一方是無法感知的。因此,進(jìn)程之間的信息傳遞不可能通過變量或其它數(shù)據(jù)結(jié)構(gòu)直接進(jìn)行,只能通過進(jìn)程間通信來完成。要實(shí)現(xiàn)實(shí)現(xiàn)進(jìn)程通信有多種方法,在課程設(shè)計中,使用Socket通信方式進(jìn)行通信,實(shí)現(xiàn)兩

7、臺計算機(jī)之間的進(jìn)程通信。 </p><p><b>  二、設(shè)計理念</b></p><p>  課程設(shè)計要求根據(jù)進(jìn)程通信的方式和類型,以及進(jìn)程通信的實(shí)現(xiàn)方法,實(shí)現(xiàn)一個簡單的聊天程序,聊天程序包括客戶端與服務(wù)器兩部分。首先要滿足在同一個計算機(jī)上可以進(jìn)行通信,在這個基礎(chǔ)上可以實(shí)現(xiàn)一對一兩臺計算機(jī)之間的通信。</p><p>  2.1整體設(shè)計需求

8、分析</p><p>  根據(jù)課題要求:根據(jù)進(jìn)程通信的方式和類型,以及進(jìn)程通信的實(shí)現(xiàn)方法,實(shí)現(xiàn)一個簡單的聊天程序,聊天程序包括客戶端與服務(wù)器兩部分。</p><p>  要選擇合適的通信方式能夠使客戶端和器端斷建立連接,聊天就需要有聊天界面,使用戶可以通過界面進(jìn)行通信。</p><p>  2.2服務(wù)器端需求分析</p><p>  服務(wù)器端

9、需要建立一個端口提供給客戶端監(jiān)聽,在建立端口后不斷進(jìn)行監(jiān)聽是否有客戶端連接或者斷開連接,若有客戶端監(jiān)聽其端口,便建立連接進(jìn)行通信。要使用Java設(shè)計編程實(shí)現(xiàn)聊天界面,當(dāng)有客戶端進(jìn)行連接之后,顯示是哪一臺計算機(jī)與服務(wù)器端進(jìn)行連接通信。</p><p>  2.3客戶端需求分析</p><p>  客戶端應(yīng)該完成的工作包括:</p><p> ?、?與服務(wù)器端建立通信通

10、道,向服務(wù)器端發(fā)送信息。</p><p> ?、?接收來自服務(wù)器的信息。</p><p>  2.4聊天界面需求分析</p><p>  聊天界面首先顯示是服務(wù)器端還是客戶端,聊天界面中要有輸入文本域,在文本域中可以顯示當(dāng)前輸入端聊天內(nèi)容,在文本域下端有文本框,可以顯示服務(wù)器與客戶只見到聊天記錄。</p><p><b>  三、過

11、程論述</b></p><p>  3.1進(jìn)程通信方式及Socket通信原理</p><p>  進(jìn)程通信的方進(jìn)程通信的管道、消息、Socket 、共享內(nèi)存、文件、信號等。本次課程設(shè)計使用的Socket通信方式。</p><p>  Socket用于在兩個基于TCP/IP協(xié)議的應(yīng)用程序之間相互通信。最早出現(xiàn)在UNIX系統(tǒng)中,是UNIX系統(tǒng)主要的信息傳遞方

12、式。在Windows系統(tǒng)中,Socket稱為winsock。其有兩個基本概念:客戶端和服務(wù)端。當(dāng)兩個應(yīng)用之間需要采用Socket通信時,首先需要在兩個應(yīng)用之間(可能位于同一臺機(jī)器,也可能位于不同的機(jī)器)建立Socket連接,發(fā)起呼叫連接請求的一方為客戶端,接受呼叫連接請求的一方成為服務(wù)端??蛻舳撕头?wù)端是相對的,同一個應(yīng)用可以是客戶端,也可以是服務(wù)端。在客戶端呼叫連接請求之前,它必須知道服務(wù)端在哪里。所以需要知道服務(wù)端所在機(jī)器的IP地址

13、或機(jī)器名稱,如果客戶端和服務(wù)端事前有一個約定就好了,這個約定就是PORT(端口號)。也就是說,客戶端可以通過服務(wù)端所在機(jī)器的IP地址或機(jī)器名稱和端口號唯一的確定方式來呼叫服務(wù)端。在客戶端呼叫之前,服務(wù)端必須處于偵聽狀態(tài),偵聽是否有客戶要求建立連接。一旦接到連接請求,服務(wù)端可以根據(jù)情況建立或拒絕連接。連接方式有兩種,同步方式(Blocking)和(noBlocking).</p><p>  客戶端發(fā)送的消息可以是

14、文本,也可以是二進(jìn)制信息流。當(dāng)客戶方的消息到達(dá)服務(wù)方端口時,會自動觸發(fā)一個事件(event),服務(wù)端只要接管該事件,就可以接受來自客戶端的消息了。</p><p>  3.2 Socket通信流程</p><p>  Socket通信首先在服務(wù)器端產(chǎn)生server Socket(同時客戶端產(chǎn)生Socket),等待客戶端連接服務(wù)器端端口號,若進(jìn)行連接之后,客戶端與服務(wù)器端便可進(jìn)行聊天,形成數(shù)

15、據(jù)流讀在緩沖區(qū)形成數(shù)組,最終顯示在文本域中,當(dāng)客戶端與服務(wù)器端斷開連接之后,立即退出,服務(wù)器端繼續(xù)監(jiān)、等待。</p><p>  圖3-1 Socket通信活動圖</p><p>  3.3 服務(wù)器端設(shè)計</p><p>  由需求分析可知,在服務(wù)器端進(jìn)行程序設(shè)計時,首先要實(shí)現(xiàn)服務(wù)器端設(shè)置socket,允許客戶端訪問,在編程設(shè)計時要實(shí)現(xiàn)圖形化界面設(shè)計</p&g

16、t;<p> ?、?設(shè)置socket語句</p><p>  ServerSocket server;//生成服務(wù)器套接字</p><p>  server = new ServerSocket(5000);//實(shí)例化套接字端口為5000 </p><p>  client = server.accept();//等待客戶機(jī)連接</p>

17、<p>  ta.append("客戶機(jī)是" + client.getInetAddress().getHostName() + "\n\n") //獲得本機(jī)地址</p><p>  //獲得指定的IP地址</p><p>  ta.append("客戶機(jī)是:" +"192.168.97. 8

18、5 "+"\n\n");</p><p>  //獲得請求連接服務(wù)器的客戶機(jī)的IP地址</p><p>  ta.append("客戶機(jī)是:" +" "+"\n\n");</p><p> ?、?服務(wù)器端程序設(shè)計</p><p>  L

19、abel label=new Label("交談內(nèi)容");</p><p>  TextField tf= new TextField(20);//實(shí)例化文本框</p><p>  TextArea ta=new TextArea( );//實(shí)例化文本域</p><p>  Panel panel=new Panel( );//創(chuàng)建面板對象<

20、;/p><p>  ServerSocket server;//創(chuàng)建服務(wù)器套接字</p><p>  Socket Client;//創(chuàng)建客戶機(jī)套接字</p><p>  InputStream DataIn;//定義輸入流</p><p>  OutputStream DataOut;//定義輸出流</p><p>  

21、public Server( )</p><p>  { super("服務(wù)器");</p><p>  setSize(300,180);//設(shè)置窗體大小</p><p>  panel.add(label);//在面板上添加標(biāo)簽</p><p>  panel.add(tf);//在面板上添加文本框</p&g

22、t;<p>  tf.addActionListener(this);//注冊</p><p>  add("North",panel);//在窗體上添加面板</p><p>  add("Center",ta);//在窗體上添加文本區(qū)</p><p>  addWindowListener(new Window

23、Adapter( )</p><p>  { public void windowClosing(WindowEvent e)</p><p>  { System.exit(0);}});</p><p>  show( ); //可以提示</p><p><b>  try</b></p><

24、;p>  { server =new ServerSocket(5000);</p><p>  Client=server.accept( );//等待客戶機(jī)連接ServerSocket(5000);</p><p>  //獲得指定的IP地址</p><p>  //ta.append("客戶機(jī)是:" +"192.168.97

25、. 85 "+"\n\n");</p><p>  //獲得請求連接服務(wù)器的地址</p><p>  ta.append("客戶機(jī)是:" +" "+"\n\n");</p><p>  DataIn=Client.getInputStream( );//實(shí)例化

26、輸入流</p><p>  DataOut=Client.getOutputStream( );//實(shí)例化輸出流</p><p><b>  }</b></p><p>  catch(IOException ioe){ }//捕獲異常</p><p>  while(true)</p><p>

27、<b>  {</b></p><p><b>  try{</b></p><p>  byte buff[ ]=new byte[512];//緩沖數(shù)組</p><p>  DataIn.read(buff);//讀出數(shù)組數(shù)據(jù)</p><p>  String str=new String(bu

28、ff);//接受客戶端發(fā)送的數(shù)據(jù)包</p><p>  ta.append("客戶機(jī)說:"+str+"\n");</p><p><b>  }</b></p><p>  catch(IOException ioe){ }</p><p><b>  }</b&g

29、t;</p><p><b>  }</b></p><p>  public static void main(String args[ ])</p><p><b>  {</b></p><p>  new Server( );//實(shí)例化Sever對象</p><p>

30、<b>  }</b></p><p>  public void actionPerformed(ActionEvent e)//事件監(jiān)聽處理程序</p><p><b>  {</b></p><p><b>  try</b></p><p><b>  { &

31、lt;/b></p><p>  String str=new String(tf.getText());//實(shí)例化字符串</p><p>  byte buf[ ]=str.getBytes( );//讀出數(shù)組</p><p>  tf.setText(" ");</p><p>  DataOut.write(b

32、uf);</p><p>  ta.append("服務(wù)器說:"+str+"\n");</p><p><b>  }</b></p><p>  catch(IOException ioe){ } </p><p><b>  }</b></p>

33、<p><b>  3.4客戶端設(shè)計</b></p><p>  由需求分析可知,在客戶端進(jìn)行程序設(shè)計時,首先要實(shí)現(xiàn)客戶端設(shè)置socket,輸入客戶端IP地址,請求連接,在編程設(shè)計時要實(shí)現(xiàn)圖形化界面設(shè)計。</p><p> ?、?設(shè)置socket語句</p><p>  Socket client;//生成客戶端套接字</p

34、><p>  client = new Socket("192.168.97.85",4000);//實(shí)例化客戶端</p><p><b> ?、?客戶端程序設(shè)計</b></p><p>  Label label=new Label("交談內(nèi)容");</p><p>  TextFi

35、eld tf= new TextField(20);//實(shí)例化文本框</p><p>  TextArea ta=new TextArea( );//實(shí)例化文本域</p><p>  Panel panel=new Panel( );//創(chuàng)建面板對象</p><p>  ServerSocket server;//創(chuàng)建服務(wù)器套接字</p><p&

36、gt;  Socket Client;//創(chuàng)建客戶機(jī)套接字</p><p>  InputStream DataIn;//定義輸入流</p><p>  OutputStream DataOut;//定義輸出流</p><p>  public Client( )</p><p>  { super("客戶機(jī)");<

37、/p><p>  setSize(300,180);</p><p>  panel.add(label);//在面板上添加標(biāo)簽</p><p>  panel.add(tf);//在面板上添加文本框</p><p>  tf.addActionListener(this);//注冊</p><p>  add("

38、;North",panel);//在窗體上添加面板</p><p>  add("Center",ta);//在窗體上添加文本區(qū)</p><p>  addWindowListener(new WindowAdapter( )</p><p>  { public void windowClosing(WindowEvent e)<

39、;/p><p>  { System.exit(0);}});</p><p><b>  show( );</b></p><p><b>  try</b></p><p>  { Client=new Socket(InetAddress.getLocalHost( ),5000);</p&

40、gt;<p>  ta.append(Client.getInetAddress( ).getHostName( )+"\n\n"); </p><p>  //ta.append("客戶機(jī)是:" +"192.168.97.84"+"\n\n"); </p><p>  DataIn=Cl

41、ient.getInputStream( );//實(shí)例化輸入流</p><p>  DataOut=Client.getOutputStream( );//實(shí)例化輸出流</p><p><b>  }</b></p><p>  catch(IOException ioe){ }</p><p>  while(true

42、)</p><p><b>  {</b></p><p><b>  try{</b></p><p>  byte buff[ ]=new byte[512];//緩沖數(shù)組</p><p>  DataIn.read(buff);//讀出數(shù)組數(shù)據(jù)</p><p>  St

43、ring str=new String(buff);//接受客戶端發(fā)送的數(shù)據(jù)包</p><p>  ta.append("服務(wù)器說:"+str+"\n");</p><p><b>  }</b></p><p>  catch(IOException ioe){ }</p><p&g

44、t;<b>  }</b></p><p><b>  }</b></p><p>  public static void main(String args[ ])</p><p><b>  {</b></p><p>  new Client( );</p>

45、<p><b>  }</b></p><p>  public void actionPerformed(ActionEvent e)//事件處理程序</p><p><b>  {</b></p><p><b>  try</b></p><p><b&

46、gt;  {</b></p><p>  String str=new String(tf.getText());//實(shí)例化字符串</p><p>  byte buf[ ]=str.getBytes( );//字符串轉(zhuǎn)換為數(shù)組存儲</p><p>  tf.setText(" ");</p><p>  Da

47、taOut.write(buf);//在客戶機(jī)中寫出輸出流里的數(shù)組</p><p>  ta.append("客戶機(jī)說:"+str+"\n");//寫入文本域</p><p><b>  }</b></p><p>  catch(IOException ioe){ } //捕獲異常</p>

48、<p><b>  四、結(jié)果分析</b></p><p>  本設(shè)計通過套接字來實(shí)現(xiàn)進(jìn)程間的通信。在TCP/IP網(wǎng)絡(luò)應(yīng)用中,通信的兩個進(jìn)程間相互作用的主要模式是客戶機(jī)/服務(wù)器模式,即客戶向服務(wù)器發(fā)出服務(wù)請求,服務(wù)器收到請求后,提供相應(yīng)的服務(wù)。由此原理,便可實(shí)現(xiàn)進(jìn)程通信功能。其中,在進(jìn)程通信前,只有設(shè)置好所要進(jìn)行通信的IP地址,并且要保證在服務(wù)器成功運(yùn)行之后,再運(yùn)行客戶機(jī),才可進(jìn)行

49、正常通信。</p><p><b>  4.1未通信時狀態(tài)</b></p><p>  只運(yùn)行服務(wù)器程序模塊或者客戶端程序模塊時,由于服務(wù)器并未與任何客戶機(jī)之間建立聯(lián)系,故無法完成通信(如圖4-1)。</p><p>  圖 4-1未連接時狀態(tài)圖</p><p><b>  4.2 單機(jī)測試</b>

50、</p><p>  當(dāng)服務(wù)器端和客戶端在同一臺計算機(jī)上運(yùn)行時,socket分別得到的都是本機(jī)IP地址,也可以進(jìn)行通信(如圖4-2)。</p><p>  圖 4-2單機(jī)通信狀態(tài)圖</p><p>  4.3 兩臺計算機(jī)間通信測試</p><p>  當(dāng)服務(wù)器端和客戶端在不同的兩臺計算機(jī)上運(yùn)行時,先給定客戶端服務(wù)器的IP地址,但服務(wù)器端運(yùn)行后

51、,在運(yùn)行客戶端便可以進(jìn)行通信(如圖4-3,圖4-4)。</p><p>  圖 4-3 兩臺計算機(jī)通信服務(wù)器端狀態(tài)圖</p><p>  圖 4-4 兩臺計算機(jī)通信服務(wù)器端狀態(tài)圖</p><p><b>  4.4錯誤操作</b></p><p>  在運(yùn)行程序時,若先運(yùn)行客戶端,則無法進(jìn)行通信(如圖4-5)。</

52、p><p>  圖4-5 運(yùn)行出錯時狀態(tài)圖</p><p><b>  4.5 分析</b></p><p>  客戶機(jī)請求連接服務(wù)器,必須在服務(wù)器端建立套接字之后。對于4.3的錯誤操作,會使通信無法進(jìn)行。在正常運(yùn)行時無特殊要求,在客戶機(jī)退出程序之后,其他計算機(jī)要想與服務(wù)器鏈接,必須先退出服務(wù)器,再重新登錄之后才能連接。</p>&l

53、t;p><b>  五、結(jié)論</b></p><p>  通過連續(xù)四周的課程設(shè)計,完成了設(shè)計要求進(jìn)程通信。在設(shè)計過程中,通過小組的共同努力,對進(jìn)程通信的學(xué)習(xí)和摸索,設(shè)計出簡單的兩臺計算機(jī)之間的聊天。在整個設(shè)計過程中,由于對于socket的不了解,遇到了一些小小的問題,我們通過不斷摸索與嘗試,學(xué)會了很多知識。在課程設(shè)計過程中,認(rèn)識到自己學(xué)習(xí)上的不足,在日常生活中還需增強(qiáng)自身的實(shí)際操作能力

54、,把理論運(yùn)用到實(shí)踐中;在設(shè)計過程中,隊(duì)員之間相互合作,使我們認(rèn)識了合作是必要性與重要性。伴隨著課程設(shè)計的結(jié)束,我們鍛煉了自身的能力,也收獲到了實(shí)現(xiàn)設(shè)計功能的喜悅。</p><p>  對于本組設(shè)計的結(jié)果,還有很對不足。例如,要進(jìn)行聊天首先客戶端必須知道服務(wù)器端的IP地址,還不能進(jìn)行多對多通信,這是我們知識量不足,能力有限,設(shè)計的時間太短,也無法在短時間內(nèi)學(xué)習(xí)其他知識來補(bǔ)充不足。通過課程設(shè)計,知道在哪些知識點(diǎn)上比較

55、薄弱,在以后的時間里,可以自己去學(xué)習(xí)相關(guān)知識加強(qiáng)自身能力。</p><p>  在課程設(shè)計過程中,遇到不懂的和不會的,老師給了我們很多幫助,真心的感謝老師。</p><p><b>  第二部分:參考文獻(xiàn)</b></p><p>  [1]趙生慧. Java面向?qū)ο蟪绦蛟O(shè)計(第二版)[M].北京:中國水利水電出版社,2010.</p>

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論