版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- java網(wǎng)絡(luò)聊天室課程設(shè)計(jì)
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)---網(wǎng)絡(luò)聊天室
- java課程設(shè)計(jì)--聊天室系統(tǒng)
- java課程設(shè)計(jì)---聊天室系統(tǒng)
- java課程設(shè)計(jì)之簡單聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)報(bào)告--基于linux網(wǎng)絡(luò)聊天室設(shè)計(jì)
- 基于java的簡單網(wǎng)絡(luò)聊天室編程
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)報(bào)告-android_socket_聊天室
- tcp課程設(shè)計(jì)--網(wǎng)絡(luò)聊天室
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-簡單的聊天室程序設(shè)計(jì)
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-簡單的聊天室程序設(shè)計(jì)
- java課程設(shè)計(jì)報(bào)告---利用java實(shí)現(xiàn)簡單聊天室
- java網(wǎng)絡(luò)聊天室畢業(yè)課程設(shè)計(jì)報(bào)告(內(nèi)附代碼)
- 基于java網(wǎng)絡(luò)聊天室設(shè)計(jì)
- java聊天室設(shè)計(jì)
- java課程設(shè)計(jì)---java聊天室的系統(tǒng)的設(shè)計(jì)與開發(fā)
- web課程設(shè)計(jì)—— 聊天室
- 軟件課程設(shè)計(jì)報(bào)告---簡易網(wǎng)絡(luò)聊天室
- 基于java的網(wǎng)絡(luò)聊天室
- java網(wǎng)絡(luò)聊天室課程設(shè)計(jì)說明書(含源程序)
評(píng)論
0/150
提交評(píng)論