2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  網(wǎng)絡(luò)編程課程設(shè)計(jì)報(bào)告</p><p>  題 目: 簡單聊天室設(shè)計(jì) </p><p>  院 系: </p><p>  專業(yè)班級(jí): </p><p>  學(xué) 號(hào): &

2、lt;/p><p>  學(xué)生姓名: </p><p>  指導(dǎo)教師: </p><p>  2016 年 1 月 6 日</p><p><b>  1.引言</b></p><p><b>  本課題的來源&l

3、t;/b></p><p>  隨著網(wǎng)絡(luò)普及和上網(wǎng)人數(shù)的大增,在國內(nèi)各大門戶網(wǎng)站都架設(shè)了大型聊天室。如:新浪聊天室、中華網(wǎng)社區(qū)聊天室、搜狐等都成為網(wǎng)民們的熱門聊天室。以新浪聊天室為例看,聊天室呈現(xiàn)積聚人氣作用,并開設(shè)不同主題的聊天室以使網(wǎng)民們具有針對(duì)性的使用聊天室。</p><p>  本人計(jì)劃設(shè)計(jì)一個(gè)實(shí)現(xiàn)基于Java語言的聊天室的Windows網(wǎng)絡(luò)編程,啟動(dòng)服務(wù)器后,客戶端運(yùn)行,向

4、服務(wù)器端發(fā)出請(qǐng)求,連接成功后,會(huì)彈出一個(gè)聊天室的界面,該界面有私聊(可加入生動(dòng)的表情描述)、群聊、發(fā)送文件等功能,客戶可以根據(jù)自己的需要選擇不同的功能。具體任務(wù)是實(shí)現(xiàn)文件的接收功能,啟動(dòng)服務(wù)器監(jiān)聽后,接收客戶端發(fā)來請(qǐng)求,安排線程接收對(duì)方發(fā)來的文件(例如文檔、照片、音樂、電影等)并存入指定的文件夾中。</p><p>  2)本系統(tǒng)涉及的知識(shí)點(diǎn)</p><p>  1、套接字Socket的建

5、立、連接、關(guān)閉,客戶端和服務(wù)器端的輸入/輸出流的連接。</p><p>  2、Java中的多線程及線程的常用方法、Runnable接口。</p><p>  3、基于SWING的圖形用戶界面設(shè)計(jì):布局設(shè)計(jì)、文本組件、按鈕與標(biāo)簽組件、列表組件等。</p><p>  4、InetAddress類。</p><p>  5、輸入/輸出流:文件、

6、文件字節(jié)流、文件字符流、緩沖流、數(shù)據(jù)流。</p><p><b>  3)功能要求</b></p><p> ?。?)在服務(wù)器端和客戶端分別創(chuàng)建一個(gè)套接字對(duì)象,通過輸入輸出流連接在一起。套接字調(diào)用close()方法關(guān)閉雙方的套接字連接。</p><p> ?。?)使用多線程處理套接字連接,把服務(wù)器端或客戶端讀取的數(shù)據(jù)放在一個(gè)單獨(dú)的線程中去進(jìn)行,

7、防止服務(wù)器端或客戶端讀取數(shù)據(jù)可能引起的堵塞。服務(wù)器端收到一個(gè)客戶的套接字后,應(yīng)該啟動(dòng)一個(gè)專門為該客戶服務(wù)的線程。</p><p> ?。?)成功連接后,在圖形界面中用戶可以根據(jù)自己的需要進(jìn)行不同的操作,如:群聊天、和某一個(gè)用戶單獨(dú)聊天(可加入生動(dòng)的表情描述)、發(fā)送文件等。在界面中會(huì)顯示用戶的聊天記錄。</p><p><b>  4)開發(fā)環(huán)境的選擇</b></p

8、><p>  在進(jìn)行開發(fā)之前,首先決定的第一個(gè)問題就是,該使用什么開發(fā)環(huán)境來編寫該系統(tǒng)?以目前常用的開發(fā)語言來講有C/C++、.NET技術(shù),JAVA、 Visual Basic幾種。還有Eclipse,、Borland JBuilder等,這些并不是程序語言,而是程序語言在建構(gòu)程序時(shí)的“集成開發(fā)工具”,不過它們?cè)陂_發(fā)設(shè)計(jì)的過程中也占有相當(dāng)重要的角色,因?yàn)檫x用正確的集成開發(fā)工具,可以加速程序設(shè)計(jì)的進(jìn)行、測(cè)試與排錯(cuò),因而

9、對(duì)整體進(jìn)度具有決定性的影響。</p><p>  基于以下幾點(diǎn),選擇JAVA語言開發(fā)技術(shù)。</p><p>  1、就執(zhí)行平臺(tái)而言,必須考慮的問題之一是用戶可能使用的操作系統(tǒng)。用戶可能使用的是Windows Linux。JAVA語言具有平臺(tái)無關(guān)性,可以不需要任何修改就可以運(yùn)行在支持JAVA的任何計(jì)算機(jī)上。</p><p>  2、JAVA的Swing 組件開發(fā)技術(shù)

10、可以開發(fā)豐富的圖形界面,并且Swing API類提供了豐富的外部接口和方法,可以方便實(shí)現(xiàn)系統(tǒng)功能。</p><p>  3、就項(xiàng)目開發(fā)而言,純粹的面向?qū)ο螅由蠑?shù)量巨大的類所提供的方法(函數(shù))庫的支持,使得利用Java開發(fā)各種應(yīng)用程序,可以說是易如反掌。此外,在程序除錯(cuò)、修改、升級(jí)和增加新功能等方面,因其面向?qū)ο蟮奶匦?,使得這些維護(hù)也變得非常容易。</p><p>  4、Java支持內(nèi)在

11、的多線程運(yùn)行,提供分布式的并發(fā)機(jī)制,運(yùn)行效率高。</p><p>  5、異常處理,為了使Java程式更穩(wěn)定、更安全,Java引入了異常處理機(jī)制。能夠在程序中產(chǎn)生異常情況的地方,執(zhí)行相對(duì)應(yīng)的處理,不至于因突發(fā)或意外的錯(cuò)誤造成執(zhí)行中斷或是死機(jī)。通過這種異常處理,不僅能夠清晰地掌握整個(gè)程序執(zhí)行的流程,也使得程序的設(shè)計(jì)更為嚴(yán)謹(jǐn)。</p><p>  6、高性能,Java可以在運(yùn)行時(shí)直接將目標(biāo)代碼

12、翻譯成機(jī)器指令。Sun用直接解釋器一秒鐘內(nèi)可調(diào)用300,000個(gè)過程。翻譯目標(biāo)代碼的速度與C/C++的性能沒什么區(qū)別。</p><p>  7、網(wǎng)絡(luò)功能,Java可以說是借助因特網(wǎng)而重獲新生的,自然具備編寫網(wǎng)絡(luò)功能的程序。不論是一般因特網(wǎng)/局域網(wǎng)的程序,如Socket、Email、基于Web服務(wù)器的Servlet、JSP程序,甚至連分布式網(wǎng)絡(luò)程序,如CORBA、RMI等的支持也是非常豐富的,使用起來也很方便。&l

13、t;/p><p><b>  5)開發(fā)技術(shù)的選擇</b></p><p>  本課題選擇了java Socket技術(shù)開發(fā)網(wǎng)絡(luò)聊天室。什么是socket? socket是一種用于表達(dá)兩臺(tái)機(jī)器之間連接“終端”的軟件抽象。對(duì)于一個(gè)給定的連接,在每臺(tái)機(jī)器上都有一個(gè)socket,你可以想象一個(gè)虛擬的"管道"工作在兩臺(tái)機(jī)器之間,“管道”連在兩臺(tái)機(jī)器的socket上

14、。當(dāng)然,物理硬件和兩臺(tái)機(jī)器之間的“管道”這些連接裝置都是未知的,抽象的所有目的就是為了讓我們不必了解更多的細(xì)節(jié)。 簡單的說,一臺(tái)計(jì)算機(jī)上的socket同另一臺(tái)計(jì)算機(jī)通話創(chuàng)建一個(gè)通信信道,程序員可以用這個(gè)信道在兩臺(tái)機(jī)器之間發(fā)送數(shù)據(jù)。當(dāng)你發(fā)送數(shù)據(jù)時(shí),TCP/IP協(xié)議棧的每一層都給你的數(shù)據(jù)里添加適當(dāng)?shù)膱?bào)頭。有個(gè)好消息是java語言隱藏了所有這些細(xì)節(jié),這也是為什么他們有時(shí)被叫做“流socket”。 思考一下socket像電話聽筒

15、一樣在電話的任意一端--你和我通過一個(gè)專門的信道來進(jìn)行通話和接聽。會(huì)話將一直進(jìn)行下去直到我們決定掛斷電話(除非我們使用蜂窩電話),除非我們掛斷電話,否則我們各自的電話線路都會(huì)占線。 如果你需要在兩臺(tái)機(jī)器之間進(jìn)行通訊而不使用高級(jí)機(jī)制像ORBs(以及CORBA, RMI, IIO</p><p>  一般而言,java socket有下面兩種類型:</p><p>  ?TCP soc

16、ket(由Socket類實(shí)現(xiàn),下面的章節(jié)我們將對(duì)其討論)</p><p>  ?UDP socket(由DatagramSocket類實(shí)現(xiàn))</p><p>  TCP和UDP扮演同樣的角色,但是實(shí)現(xiàn)是不同的。兩者都接收傳輸協(xié)議數(shù)據(jù)包并把它們傳遞到表示層。TCP把信息分解成數(shù)據(jù)包(datagrams)并在接收端重新組裝起來。它還對(duì)丟失的數(shù)據(jù)包進(jìn)行重新傳輸?shù)恼?qǐng)求。TCP減少了上層的擔(dān)憂。UD

17、P沒有組裝和重傳請(qǐng)求的功能。它只是傳輸數(shù)據(jù)包。更高層的層必須確保信息的完整性以及組合順序的正確性。</p><p><b>  2.功能設(shè)計(jì)</b></p><p>  1、Socket socket = new Socket(String host,int port);客戶端創(chuàng)建Socket對(duì)象,host是服務(wù)器端的IP地址,port是一個(gè)端口號(hào),該對(duì)象用于連接服務(wù)

18、器。</p><p>  2、BufferedReader br=new BufferedReader</p><p>  (new InputStreamReader(socket.getInputStream())); 創(chuàng)建一個(gè)使用默認(rèn)大小輸入緩沖區(qū)的緩沖字符輸入流。該輸入流的指向是一個(gè)Reader流,Reader流將數(shù)據(jù)讀入緩沖區(qū),BufferedReader再從緩沖區(qū)中讀

19、取數(shù)據(jù)。InputStreamReader是字節(jié)流通向字符流的橋梁:它使用指定的charset讀取字節(jié)并將其解碼為字符。getInputStream()獲取字節(jié)輸入流。</p><p>  3、PrintStream ps = new PrintStream(socket.getOutputStream());創(chuàng)建新的打印流,PrintStream 為其他輸出流添加了功能,使它們能夠方便地打印各種數(shù)據(jù)值表示形式。

20、它還提供其他兩項(xiàng)功能。與其他輸出流不同,PrintStream 永遠(yuǎn)不會(huì)拋出 IOException;而是,異常情況僅設(shè)置可通過 checkError 方法測(cè)試的內(nèi)部標(biāo)志。</p><p>  4、File file = getFile();調(diào)用getFile()函數(shù)返回一個(gè)file的的路徑,提示用戶輸入一個(gè)路徑,判斷是否存在該文件, 如果輸入非法給予提示, 重新輸入。</p><p> 

21、 5、ps.println(file.getName()); ps.println(file.length());將文件名和大小發(fā)送到服務(wù)端。</p><p>  6、String msg = br.readLine();if("已存在".equals(msg)){} 接收服務(wù)器發(fā)送回來的是否存在的結(jié)果. 如果文件已存在, 打印提示, 客戶端退出. 如果不存在, 準(zhǔn)備開始上傳。</p&g

22、t;<p>  7、long finishLen = Long.parseLong(msg); 服務(wù)器端文件的長度。</p><p>  8、FileInputStream fis = new FileInputStream(file); 創(chuàng)建FileInputStream從文件中讀取數(shù)據(jù),OutputStream out = socket.getOutputStream();輸出字節(jié)流,輸出流

23、接收輸出字節(jié)并將這些字節(jié)寫出到Socket的輸出流。</p><p>  9、fis.skip(finishLen); 從輸入流中跳過并丟棄finishLen個(gè)字節(jié)的數(shù)據(jù),即跳過服務(wù)端已完成的大小。</p><p>  10、len = fis.read(byte[] buffer)); 從此輸入流中將最多 b.length 個(gè)字節(jié)的數(shù)據(jù)讀入一個(gè) byte 數(shù)組中。</p

24、><p>  11、out.write(byte[] b,int off,int len) 將指定 byte 數(shù)組中從偏移量 off 開始的 len 個(gè)字節(jié)寫入此輸出流。</p><p><b>  3.聊天室界面</b></p><p><b>  4.全部程序:</b></p>

25、<p><b>  服務(wù)器端:</b></p><p>  package chat;</p><p>  import java.net.*;</p><p>  import java.io.*;</p><p>  import java.util.*;</p><p>  pub

26、lic class ChatServer{</p><p>  public static void main(String[] args)throws Exception{</p><p>  ServerSocket svSocket =null;</p><p>  Vector threads = new Vector();</p><

27、;p><b>  try {</b></p><p>  svSocket = new ServerSocket(5555);</p><p>  System.out.println ("listening...");</p><p>  }catch (Exception ex) {</p><

28、p>  System.out.println ("Server create ServerSocket failed!");</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  try{</b></p&

29、gt;<p>  int nid = 0;</p><p>  while(true){</p><p>  Socket socket = svSocket.accept();</p><p>  System.out.println ("accept a client");</p><p>  Serve

30、rThread st = new ServerThread(socket,threads);</p><p>  st.setID(nid++);</p><p>  threads.add(st);</p><p>  new Thread(st).start();</p><p>  for(int i=0;i < threads.

31、size();i++){</p><p>  ServerThread temp = (ServerThread)threads.elementAt(i);</p><p><b>  }</b></p><p>  System.out.println ("Listen again...");</p><

32、;p><b>  }</b></p><p>  }catch(Exception ex){</p><p>  System.out.println ("server is down");</p><p><b>  }</b></p><p><b>  }&

33、lt;/b></p><p><b>  }</b></p><p>  class ServerThread implements Runnable{</p><p>  private Vector threads;</p><p>  private Socket socket = null;</p&g

34、t;<p>  private DataInputStream in = null;</p><p>  private DataOutputStream out = null;</p><p>  private int nid;</p><p>  public ServerThread(Socket socket,Vector threads){

35、</p><p>  this.socket = socket;</p><p>  this.threads = threads;</p><p><b>  try {</b></p><p>  in = new DataInputStream(socket.getInputStream());</p>

36、<p>  out = new DataOutputStream(socket.getOutputStream());</p><p><b>  }</b></p><p>  catch (Exception ex) {</p><p><b>  }</b></p><p>&l

37、t;b>  }</b></p><p>  public void run(){</p><p>  System.out.println ("Thread is running");</p><p><b>  try{</b></p><p>  while(true){<

38、/p><p>  String receive = in.readUTF();</p><p>  if(receive == null) return;</p><p><b>  //下線通知</b></p><p>  if(receive.contains("黯然下線了")){</p&g

39、t;<p>  for(int i=0;i < threads.size();i++){</p><p>  ServerThread st = (ServerThread)threads.elementAt(i);</p><p>  st.write("***"+receive+"***");</p><p

40、><b>  }</b></p><p><b>  }</b></p><p><b>  //上線通知</b></p><p>  else if(receive.contains("上線了")){</p><p>  for(int i=0;i

41、< threads.size();i++){</p><p>  ServerThread st = (ServerThread)threads.elementAt(i);</p><p>  st.write("<"+getID()+">: "+receive);</p><p><b>  }

42、</b></p><p><b>  }</b></p><p>  //作為服務(wù)器監(jiān)聽中</p><p>  else if(receive.contains("監(jiān)聽中")){</p><p>  for(int i=0;i < threads.size();i++){</p

43、><p>  ServerThread st = (ServerThread)threads.elementAt(i);</p><p>  st.write("***"+receive+"*** ");</p><p><b>  }</b></p><p><b> 

44、 }</b></p><p><b>  //發(fā)送消息</b></p><p>  else if(receive.contains("說")){</p><p><b>  //發(fā)送廣播消息</b></p><p>  if(receive.contains(&qu

45、ot;大家")){</p><p>  for(int i=0;i < threads.size();i++){</p><p>  ServerThread st = (ServerThread)threads.elementAt(i);</p><p>  st.write("<"+getID()+">:

46、 "+receive);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //發(fā)送指定消息</b></p><p><b>  else{</b></p><p>

47、;  int temp=receive.indexOf("<"); </p><p>  int temp1=receive.indexOf(">"); </p><p>  //獲得接收者ID號(hào)</p><p>  String tempS=receive.substring(temp+1,temp1); <

48、;/p><p>  int i=Integer.parseInt(tempS);</p><p><b>  //指定接收者輸出</b></p><p>  ServerThread st = (ServerThread)threads.elementAt(i);</p><p>  st.write("<&

49、quot;+getID()+">: "+receive);</p><p>  //發(fā)送者自己也輸出</p><p>  st = (ServerThread)threads.elementAt(getID());</p><p>  st.write("<"+getID()+">: "+

50、receive);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else{</b></p><p>  ServerThread st = (ServerThread)threads.elementAt(getID

51、());</p><p>  st.write("***"+receive+"***");</p><p><b>  }</b></p><p><b>  }</b></p><p>  }catch(Exception ex){</p>&

52、lt;p>  threads.removeElement(this);</p><p>  ex.printStackTrace();</p><p><b>  }</b></p><p><b>  try{</b></p><p>  socket.close();</p>

53、<p>  }catch(Exception ex){</p><p>  ex.printStackTrace();</p><p><b>  }</b></p><p><b>  }</b></p><p>  public void write(String msg){<

54、/p><p>  synchronized(out){</p><p><b>  try{</b></p><p>  out.writeUTF(msg);</p><p>  }catch(Exception ex){</p><p><b>  }</b></p>

55、;<p><b>  }</b></p><p><b>  }</b></p><p>  public int getID(){</p><p>  return this.nid;</p><p><b>  }</b></p><p&g

56、t;  public void setID(int nid){</p><p>  this.nid = nid;</p><p><b>  }</b></p><p><b>  }</b></p><p>  服務(wù)器端的文件傳送:</p><p>  package c

57、hat;</p><p>  import java.io.BufferedReader;</p><p>  import java.io.File;</p><p>  import java.io.FileOutputStream;</p><p>  import java.io.IOException;</p><

58、;p>  import java.io.InputStream;</p><p>  import java.io.InputStreamReader;</p><p>  import java.io.PrintStream;</p><p>  import java.net.ServerSocket;</p><p>  impo

59、rt java.net.Socket;</p><p>  import java.text.SimpleDateFormat;</p><p>  import java.util.Date;</p><p>  import javax.swing.JOptionPane;</p><p>  public class filesendS

60、erver{</p><p>  public void filereceive() throws Exception{</p><p>  //1.創(chuàng)建ServerSocket, 在循環(huán)中接收客戶端請(qǐng)求, 每接收到一個(gè)請(qǐng)求就開啟新線程處理</p><p>  ServerSocket serverSocket = new ServerSocket(1234);&l

61、t;/p><p>  JOptionPane.showMessageDialog(null,"服務(wù)已啟動(dòng),綁定1234端口!");</p><p>  while(true){</p><p>  Socket socket = serverSocket.accept();</p><p>  new fileServerT

62、hread(socket).start();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  class fileServerThread extends Thread{</p&g

63、t;<p>  Socket socket;</p><p>  public fileServerThread(Socket socket) {</p><p>  this.socket = socket;</p><p><b>  }</b></p><p>  public void run()

64、{</p><p>  FileOutputStream fos = null;</p><p><b>  try {</b></p><p>  //3.獲取輸入輸出流</p><p>  BufferedReader br = new BufferedReader(new InputStreamReader(soc

65、ket.getInputStream()));</p><p>  PrintStream ps = new PrintStream(socket.getOutputStream());</p><p>  //7.接收文件, 查找是否存在. 如果存在, 給寫一個(gè)消息給客戶端, 服務(wù)端線程結(jié)束. 如果不存在, 寫消息給客戶端, 準(zhǔn)備開始上傳.</p><p>  S

66、tring fileName = br.readLine(); </p><p>  long fileLen = Long.parseLong(br.readLine());</p><p>  File dir = new File("upload");</p><p>  dir.mkdir();</p><p>

67、  File file = new File(dir,fileName);</p><p>  if(file.exists() && file.length() == fileLen){ // 文件已存在, length()即為文件大小, 文件不存在length()為0</p><p>  ps.println("已存在");</p>

68、<p><b>  return;</b></p><p><b>  }</b></p><p><b>  else{</b></p><p>  ps.println(file.length()); // 文件已存在, length()即為文件大小, 文件不存在length()為0&l

69、t;/p><p><b>  }</b></p><p>  //10.從Socket的輸入流中讀取數(shù)據(jù), 創(chuàng)建FileOutputStream寫出到文件中</p><p>  String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())

70、;</p><p>  System.out.println(time + " "+ (file.exists() ? " 開始斷點(diǎn)續(xù)傳: " : " 開始上傳文件: ") + file.getName());</p><p>  long start = System.currentTimeMillis();</p>

71、<p>  InputStream in = socket.getInputStream();</p><p>  fos = new FileOutputStream(file, true); // 文件存在就追加, 文件不存在則創(chuàng)建</p><p>  byte[] buffer = new byte[1024];</p><p><b&g

72、t;  int len;</b></p><p>  while((len = in.read(buffer)) != -1){ //這個(gè)地方會(huì)堵塞,如果客服端沒有關(guān)閉socket.服務(wù)器端讀不到流末尾(-1)</p><p>  fos.write(buffer, 0, len);</p><p>  if(file.length() == file

73、Len) // 文件大小等于客戶端文件大小時(shí), 代表上傳完畢</p><p><b>  break;</b></p><p><b>  }</b></p><p>  fos.close();</p><p>  long end = System.currentTimeMillis();<

74、;/p><p>  time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());</p><p>  System.out.println(time + " " + " 上傳文件結(jié)束: " + file.getName() + ", 耗時(shí): &q

75、uot; + (end - start) + "毫秒");</p><p>  ps.println("上傳成功");</p><p>  socket.close();</p><p>  } catch (IOException e) {</p><p>  if(fos != null)</

76、p><p><b>  try {</b></p><p>  fos.close();</p><p>  } catch (IOException e1) {</p><p>  e1.printStackTrace();</p><p><b>  }</b></p&

77、gt;<p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  客戶端的界面設(shè)計(jì):</b></p><p>  package chat;</p>

78、<p>  import java.awt.*;</p><p>  import java.io.*;</p><p>  import java.net.*;</p><p>  import java.awt.event.*;</p><p>  import javax.swing.*;</p><p&

79、gt;  public class Client</p><p><b>  {</b></p><p>  public static void main(String args[])</p><p><b>  {</b></p><p>  new ChatClient();</p>

80、;<p><b>  }</b></p><p><b>  }</b></p><p>  class ChatClient extends Frame implements ActionListener, Runnable{</p><p>  private static final long seri

81、alVersionUID = -4149839042245330513L;</p><p>  public Button listen,connection,sendtoall,sendtoone,exit,filesend;</p><p>  public JComboBox emote;</p><p>  public TextField inputNam

82、e,inputContent;</p><p>  public TextArea chatResult;</p><p>  public Socket socket=null;</p><p>  public DataInputStream in=null;</p><p>  public DataOutputStream out=n

83、ull;</p><p>  public Thread thread;</p><p>  ChatClient()</p><p><b>  {</b></p><p>  socket=new Socket();</p><p>  Box box1=Box.createHorizonta

84、lBox();</p><p>  listen=new Button("作為服務(wù)器監(jiān)聽");</p><p>  connection=new Button("連接服務(wù)器");</p><p>  filesend=new Button("發(fā)送文件");</p><p>  exi

85、t=new Button("退出");</p><p>  sendtoall=new Button("群聊");</p><p>  sendtoone=new Button("私聊");</p><p>  listen.setEnabled(false);</p><p>  

86、filesend.setEnabled(false);</p><p>  sendtoall.setEnabled(false);</p><p>  sendtoone.setEnabled(false);</p><p>  inputName=new TextField(6);</p><p>  inputName.setBackg

87、round(new Color(162,231,250));</p><p>  inputContent=new TextField(22);</p><p>  inputContent.setBackground(new Color(162,231,250));</p><p>  chatResult= new TextArea("",

88、17,20,TextArea.SCROLLBARS_VERTICAL_ONLY);</p><p>  chatResult.setBackground(new Color(162,231,250));</p><p>  JLabel jlname=new JLabel("輸入昵稱");</p><p>  box1.add(jlname);&

89、lt;/p><p>  box1.add(inputName);</p><p>  box1.add(listen);</p><p>  box1.add(connection);</p><p>  box1.add(filesend);</p><p>  box1.add(exit);</p>&l

90、t;p>  Box box2=Box.createHorizontalBox();</p><p>  emote = new JComboBox();</p><p>  emote.setModel(new DefaultComboBoxModel(new String[] { "表情", "微笑",</p><p>

91、;  "甜笑", "驚喜", "嘻嘻", "扮酷", "嘿嘿", "傻笑", "好奇", "媚眼", "鬼臉", "陶醉",</p><p>  "害羞", "生氣", &qu

92、ot;嚷嚷", "發(fā)怒", "傷心", "高明", "菜鳥", "問號(hào)", "狂笑", "大哭",</p><p>  "示愛", "呻吟", "想想" }));</p><p> 

93、 emote.setEnabled(false);</p><p>  JLabel jlintput = new JLabel("輸入聊天內(nèi)容");</p><p>  box2.add(jlintput);</p><p>  box2.add(inputContent);</p><p>  box2.add(emo

94、te);</p><p>  box2.add(sendtoall);</p><p>  box2.add(sendtoone);</p><p>  listen.addActionListener(this);</p><p>  connection.addActionListener(this);</p><p&

95、gt;  filesend.addActionListener(this);</p><p>  exit.addActionListener(this);</p><p>  sendtoall.addActionListener(this);</p><p>  sendtoone.addActionListener(this);</p><

96、p>  Box box3=Box.createHorizontalBox();</p><p>  box3.add(chatResult);</p><p>  thread=new Thread(this);</p><p>  Box box0=Box.createVerticalBox();</p><p>  box0.add

97、(Box.createVerticalStrut(10));</p><p>  box0.add(box1);</p><p>  box0.add(Box.createVerticalStrut(10));</p><p>  box0.add(box3);</p><p>  box0.add(Box.createVerticalStr

98、ut(10));</p><p>  box0.add(box2);</p><p>  box0.add(Box.createVerticalStrut(10));</p><p>  add(box0);</p><p>  setBounds(10,30,500,400);</p><p>  setBackgr

99、ound(new Color(80,212,248));</p><p>  setVisible(true);</p><p>  validate();</p><p>  addWindowListener(new WindowAdapter(){</p><p>  public void windowClosing(WindowEv

100、ent e){</p><p>  System.exit(0);</p><p><b>  try {</b></p><p>  socket.close();</p><p>  } catch (IOException e1) {</p><p>  e1.printStackTrace

101、();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  });</b></p><p><b>  }</b></p><p>  public void actionP

102、erformed(ActionEvent e) {</p><p>  ActionProcess actionProcess=new ActionProcess(this);</p><p><b>  try {</b></p><p>  actionProcess.action(e);</p><p>  } c

103、atch (Exception e1) {</p><p>  e1.printStackTrace();</p><p><b>  }</b></p><p><b>  }</b></p><p>  public void run()</p><p><b>

104、;  {</b></p><p>  String s=null;</p><p>  while(true)</p><p><b>  {</b></p><p><b>  try</b></p><p><b>  {</b><

105、/p><p>  s=in.readUTF();</p><p>  chatResult.append("\n"+s);</p><p><b>  }</b></p><p>  catch(IOException e)</p><p><b>  {</b&g

106、t;</p><p>  chatResult.setText("與服務(wù)器斷開連接");</p><p><b>  try</b></p><p><b>  {</b></p><p>  socket.close();</p><p><b&g

107、t;  }</b></p><p>  catch(Exception ep){}</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b&

108、gt;  }</b></p><p><b>  }</b></p><p>  客戶端的界面事件處理:</p><p>  package chat;</p><p>  import java.awt.event.ActionEvent;</p><p>  import java

109、.io.DataInputStream;</p><p>  import java.io.DataOutputStream;</p><p>  import java.io.IOException;</p><p>  import java.net.*;</p><p>  import javax.swing.JOptionPane;

110、</p><p>  public class ActionProcess implements Runnable {</p><p>  private ChatClient client;</p><p>  String name="";</p><p>  String sendtoname=""

111、;;</p><p>  String sendtoID;</p><p>  String filename="";</p><p>  String filepath="";</p><p>  public ActionProcess(ChatClient client) {</p>

112、<p>  this.client=client;</p><p><b>  }</b></p><p>  public void action(ActionEvent e)throws Exception{</p><p>  if(e.getSource()==client.connection)</p>&l

113、t;p><b>  {</b></p><p><b>  try</b></p><p><b>  {</b></p><p>  if(client.socket.isConnected()){}</p><p><b>  else</b>&

114、lt;/p><p><b>  {</b></p><p>  String addr=JOptionPane.showInputDialog("請(qǐng)輸入服務(wù)器IP:");</p><p>  InetAddress address=InetAddress.getByName(addr);</p><p>

115、  InetSocketAddress socketAddress=new InetSocketAddress(address,5555);</p><p>  client.socket.connect(socketAddress);</p><p>  client.in=new DataInputStream(client.socket.getInputStream());</

116、p><p>  client.out=new DataOutputStream(client.socket.getOutputStream());</p><p>  name=client.inputName.getText();</p><p>  client.out.writeUTF("姓名為"+name+"的朋友風(fēng)塵仆仆地上線了.

117、..");</p><p>  client.listen.setEnabled(true);</p><p>  client.filesend.setEnabled(true);</p><p>  client.sendtoall.setEnabled(true);</p><p>  client.sendtoone.set

118、Enabled(true);</p><p>  client.emote.setEnabled(true);</p><p>  if(!(client.thread.isAlive()))</p><p>  client.thread=new Thread(this);</p><p>  client.thread.start();&

119、lt;/p><p><b>  } </b></p><p><b>  }</b></p><p>  catch(IOException ee){}</p><p><b>  }</b></p><p>  if(e.getSource()==clie

120、nt.listen)</p><p><b>  {</b></p><p><b>  try</b></p><p><b>  {</b></p><p>  name=client.inputName.getText();</p><p>  c

121、lient.out.writeUTF("姓名為"+name+"的朋友正在監(jiān)聽中...");</p><p>  filesendServer filesendserver=new filesendServer();</p><p>  filesendserver.filereceive();</p><p><b&g

122、t;  }</b></p><p>  catch (Exception ee) {</p><p>  ee.printStackTrace();</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(e.ge

123、tSource()==client.filesend){</p><p>  if(client.socket.isConnected())</p><p><b>  try {</b></p><p>  filesendClient filesendclient=new filesendClient();</p><p

124、>  filesendclient.filesend();</p><p>  client.out.writeUTF("成功發(fā)送文件!");</p><p>  }catch (Exception ee){} </p><p><b>  }</b></p><p>  if(e.get

125、Source()==client.exit)</p><p>  { if(client.socket.isConnected())</p><p><b>  try {</b></p><p>  name=client.inputName.getText();</p><p>  client.out.write

126、UTF("姓名為"+name+"的朋友黯然下線了...");</p><p>  client.out.flush(); </p><p>  client.out.close();</p><p>  client.socket.close();</p><p>  } catch (IOExcept

127、ion e1) {</p><p>  e1.printStackTrace();</p><p><b>  }</b></p><p>  System.exit(0);</p><p><b>  }</b></p><p>  String em=client.emo

128、te.getSelectedItem().toString();</p><p>  if (em.equals("表情")) {</p><p><b>  em = "";</b></p><p><b>  } else {</b></p><p>  

129、em += "著";</p><p><b>  }</b></p><p>  if(e.getSource()==client.sendtoall)</p><p><b>  {</b></p><p>  if(client.socket.isConnected()){&

130、lt;/p><p>  name=client.inputName.getText();</p><p>  String s=client.inputContent.getText();</p><p>  if(s!=null)</p><p><b>  {</b></p><p><b&

131、gt;  try</b></p><p><b>  {</b></p><p>  client.out.writeUTF(name+em+"對(duì)大家說:"+s);</p><p>  client.out.flush(); </p><p>  client.inputContent.s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論