版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> Java程序設(shè)計課程設(shè)計</p><p> 題 目: 聊天程序 </p><p> 學(xué)生姓名: Puter </p><p><b> 課程設(shè)計任務(wù)書</b></p><p> 注:任務(wù)書由指導(dǎo)教師填寫。<
2、;/p><p> 題 目聊天程序</p><p> 1、課程設(shè)計的目的通過本課程設(shè)計使學(xué)生能夠較全面的掌握面向?qū)ο蟪绦蛟O(shè)計的有關(guān)概念和開發(fā)方法,以便能較全面地理解、掌握和綜合運(yùn)用所學(xué)的知識,提高自身的編程能力。</p><p> 2、課程設(shè)計的內(nèi)容和要求(包括原始數(shù)據(jù)、技術(shù)要求、工作要求等)該程序?qū)崿F(xiàn)聊天功能,包括服務(wù)器段程序和客戶端程序。要求:(1)客戶端程序:可連接
3、到服務(wù)器,并將消息發(fā)送到服務(wù)器端和接受服務(wù)器端發(fā)送來的消息。(2)服務(wù)器端程序:可將消息發(fā)送到客戶端和接受客戶端發(fā)送來的消息。</p><p> 3、主要參考文獻(xiàn)[1]朱福喜.《Java語言程序設(shè)計》(第二版).科學(xué)出版社[2]陳國君等.《Java程序設(shè)計基礎(chǔ)》(第二版).清華大學(xué)出版社[3] Deitel.《Java大學(xué)基礎(chǔ)教程》(第六版).電子工業(yè)出版社 [4] MaryCampione.《Java語言導(dǎo)學(xué)
4、》(第四版).機(jī)械工業(yè)出版社[5] Y.Daniel Liang.《Java語言程序設(shè)計基礎(chǔ)篇》(第六版). 機(jī)械工業(yè)出版社[6] Kathy Sierra.《Head First Java》(第二版).東南大學(xué)出版社</p><p> 4、課程設(shè)計工作進(jìn)度計劃</p><p> 指導(dǎo)教師(簽字)日期年 月 日</p><p> 教研室意見:年 月
5、 日</p><p> 學(xué)生(簽字): 接受任務(wù)時間: 年 月 日</p><p><b> 目錄</b></p><p> 摘要...................................................1</p><p> 需求分析.............
6、...............................1</p><p> 概要設(shè)計............................................3</p><p> 三、 詳細(xì)設(shè)計............................................4四、 調(diào)試分析..................................
7、..........4</p><p> 五、結(jié)論................................................14</p><p> 六、實驗分工.............................................14</p><p> 七、參考文獻(xiàn)...........................
8、...................14</p><p><b> 摘 要</b></p><p> 在網(wǎng)絡(luò)越來越發(fā)達(dá)的今天,人們對網(wǎng)絡(luò)的依賴越來越多,越來越離不開網(wǎng)絡(luò),由此而產(chǎn)生的聊天工具越來越多,例如,國外的ICQ、國內(nèi)騰訊公司開發(fā)的OICQ。基于Java網(wǎng)絡(luò)編程的強(qiáng)大功能,本次畢業(yè)設(shè)計使用Java編寫一個聊天系統(tǒng)。
9、160;</p><p> 一般來說,聊天工具大多數(shù)由客戶端程序和服務(wù)器程序外加服務(wù)器端用于存放客戶數(shù)據(jù)的數(shù)據(jù)庫組成,本系統(tǒng)采用客戶機(jī)/服務(wù)器架構(gòu)模式通過Java提供的Soket類來連接客戶機(jī)和服務(wù)器并使客戶機(jī)和服務(wù)器之間相互通信,由于聊天是多點(diǎn)對多點(diǎn)的而Java提供的多線程功能用多線程可完成多點(diǎn)對多點(diǎn)的聊天,數(shù)據(jù)庫管理系統(tǒng)用SQL Server2000完成并通過JDBC-ODBC橋訪問數(shù)據(jù)庫。
10、60;現(xiàn)在的各種聊天工具功能越來越強(qiáng)大,但是它們的唯一的不足就是必須要聯(lián)網(wǎng)或者下載到它們的服務(wù)端,要不然是沒法脫離Intenet使用的。為了能在一個沒有連接到Intenet的局域網(wǎng)使用聊天工具,那就必須要有服務(wù)器端。</p><p> 本系統(tǒng)就是包括服務(wù)器端與客戶端,可以在局域網(wǎng)聊天的一個工具。建立在JAVA平臺上,系統(tǒng)的設(shè)計使用了面向?qū)ο蠹夹g(shù)和面向?qū)ο蟮脑O(shè)計原則。系統(tǒng)采用C/S結(jié)構(gòu),客戶端與客戶端以及客戶端與
11、服務(wù)器端之間通過Socket傳送消息。使用JAVA語言編寫,開發(fā)工具采用Eclipse。服務(wù)器端設(shè)計與實現(xiàn)過程中,采用了多線程技術(shù),可以在單個程序當(dāng)中同時運(yùn)行多個不同的線程,執(zhí)行不同的任務(wù)。大大增強(qiáng)了程序?qū)Ψ?wù)器資源的利用。 </p><p> 聊天系統(tǒng)完成后將可進(jìn)行多人對多人的聊天,對好友進(jìn)行添加、刪除,對新用戶的注冊,發(fā)送消息、接受消息等等功能。 </p><p>
12、; 關(guān)鍵詞:多線程 ;客戶機(jī)/服務(wù)器 ;JAVA ; Socket ; Eclipse ; TCP/IP </p><p><b> 需求分析</b></p><p> 為了更好的掌握java這門課程的內(nèi)容,同時更好的理解與掌握socket編程,對所有面向?qū)ο蟮木幊趟枷胍约?/p>
13、編程方法的一個總結(jié)、回顧和實踐,掌握J(rèn)ava語言編程技巧。要求使用圖形用戶界面。能實現(xiàn)一個聊天室中多人聊天??梢詢扇怂搅?。(提示:使用socket通信)程序描述清晰準(zhǔn)確,思路清晰,程序能夠?qū)崿F(xiàn)相應(yīng)的功能。聊天時系統(tǒng)是通過即時通訊技術(shù)來實現(xiàn)在線聊天、交流的軟件。目前有2種架構(gòu)形式,1、一種是C/S架構(gòu),采用客戶端/服務(wù)器形式,用戶使用過程中需要下載安裝客戶端軟件,典型的代表有:QQ、百度HI 、Skype
14、QQ VS GU、Gtalk、新浪UC、MSN等;2、采用B/S架構(gòu),即瀏覽器/服務(wù)端形式,這種形式的即時通訊軟件,直接借助互聯(lián)網(wǎng)為媒介、客戶端無需安裝任何軟件,既可以體驗服務(wù)器端進(jìn)行溝通對話,一般運(yùn)用在電子商務(wù)網(wǎng)站的服務(wù)商,典型的代表有Websitelive 、53KF、live800等</p><p><b> 二、概要設(shè)計</b></p>
15、<p> 目前國內(nèi)外做聊天系統(tǒng)的公司很多,產(chǎn)品也琳瑯滿目,國內(nèi)有諸如騰訊QQ、新浪UC、網(wǎng)易泡泡等,國外有著名的MSN(新版改名為Live Messenger)以及跨平臺Gaim等。本人取最具代表性的QQ和MSN進(jìn)行了一些研究,作為我開發(fā)聊天系統(tǒng)的準(zhǔn)備。 </p><p> 騰訊無疑是國內(nèi)即時通訊市場的霸主,自從99年進(jìn)入即時通訊領(lǐng)域并迅速占市場之后,其在國內(nèi)用戶數(shù)量始終高居榜首
16、,即使近幾年面對微軟MSN的強(qiáng)大攻勢,騰訊QQ的時常占有率依然穩(wěn)步增長。騰訊的成功與其對QQ的不斷創(chuàng)新和完善是分不開的。 </p><p> 參考了許多網(wǎng)絡(luò)上的資料,以及自己通過觀察騰訊QQ運(yùn)行時的各種細(xì)節(jié)??梢源_定騰訊QQ是以多服務(wù)器提供服務(wù)、服務(wù)器總控客戶端、客戶端之間UDP直連通信的。并且在兩個客戶端之間不能建立直連的情況下,才由服務(wù)器進(jìn)行中轉(zhuǎn)通信。 </p><p
17、> 其模型如圖1-1 </p><p><b> 圖1.1</b></p><p><b> 詳細(xì)設(shè)計</b></p><p> 通過TCP網(wǎng)絡(luò)編程,主要編寫有客戶端與服務(wù)器端兩個部分,服務(wù)器端通過循環(huán)一直從客戶端接收信息,并通過線程實現(xiàn)多個客戶端連接。服務(wù)器發(fā)送信息則通過定義鏈表保存客
18、戶端信息。每個客戶端向服務(wù)器發(fā)送信息時,則通過鏈表中的所有客戶端的連接而發(fā)送信息給所有客戶端界面從而實現(xiàn)局域網(wǎng)內(nèi)多人聊天。而客戶端則主要是界面的編寫,通過一個線程一直從服務(wù)器獲取信息,如果不為空時就在界面上顯示。</p><p><b> 調(diào)試分析</b></p><p> 首先運(yùn)行服務(wù)器如圖1.2:</p><p><b>
19、圖1.2</b></p><p> 分析:服務(wù)器進(jìn)入阻塞狀態(tài)。等待連接。</p><p><b> 主要代碼:</b></p><p> package org.pzhu.net.server;</p><p> import java.io.IOException;</p><p
20、> import java.net.ServerSocket;</p><p> import java.net.Socket;</p><p> import java.util.ArrayList;</p><p> import java.util.List;</p><p> import org.pzhu.net.s
21、erver.thread.ThreadServer;</p><p> public class Server {//服務(wù)器功能實現(xiàn)</p><p> private ServerSocket server = null ;</p><p> public static List<Socket> list = new ArrayLis
22、t<Socket>() ;//定義鏈表儲存客戶信息</p><p> private Socket client = null ;</p><p> private int count = 0 ;</p><p> public Server(){</p><p><b> try {</b><
23、/p><p> server = new ServerSocket(8888) ;//創(chuàng)建服務(wù)器</p><p> } catch (IOException e1) {</p><p> e1.printStackTrace();</p><p><b> }</b></p><p>
24、System.out.println("等待服務(wù)器被連接······");</p><p> boolean flag = true ;</p><p> while(flag){</p><p> synchronized(this){</p><p>&
25、lt;b> try {</b></p><p> client = server.accept() ;</p><p> count++;//記錄客戶連接數(shù)目</p><p> } catch (IOException e1) {</p><p> e1.printStackTrace();</p&g
26、t;<p><b> }</b></p><p> list.add(client) ;</p><p> System.out.println("第"+count+"客戶端被連接!");</p><p><b> try {</b></p>&l
27、t;p> new Thread(new ThreadServer(client)).start();//定義線程,實現(xiàn)多個客戶端連接</p><p> } catch (Exception e) {</p><p> e.printStackTrace();</p><p> flag = false ;</p><p><
28、;b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> try {</b></p><p> server.close();</p><p> } catch
29、 (IOException e) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> package
30、 org.pzhu.net.server.thread;</p><p> import java.io.BufferedReader;</p><p> import java.io.InputStreamReader;</p><p> import java.io.PrintStream;</p><p> import jav
31、a.net.Socket;</p><p> import java.util.Iterator;</p><p> import org.pzhu.net.server.util.ListCO;</p><p> public class ThreadServer implements Runnable{/定義線程,實現(xiàn)多個客戶端連接</p>
32、<p> private BufferedReader buf = null ;</p><p> private Socket client = null ;</p><p> public ThreadServer(Socket client) throws Exception{</p><p> this.client = client
33、 ;</p><p> buf=new BufferedReader(new InputStreamReader(this.client.getInputStream())) ;//連接從客戶端獲取信息</p><p><b> }</b></p><p><b> @Override</b></p>
34、<p> public void run(){//線程</p><p> String str = null ;</p><p> boolean f = true ;</p><p> while(f){//一直與連接的客戶端通訊</p><p><b> try {</b>&
35、lt;/p><p> str = buf.readLine() ;</p><p> } catch (Exception e) {</p><p> f = false ;</p><p><b> }</b></p><p> if("bye".equals(str)
36、){</p><p> f = false ;</p><p><b> }else{</b></p><p> ListCO lout = null ;</p><p><b> try {</b></p><p> lout = new ListCO();<
37、;/p><p> } catch (Exception e) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p> Iterator<PrintStream> iter = lout.getLout().iterator();//向所有的客
38、戶端發(fā)送信息</p><p> while(iter.hasNext()){</p><p> PrintStream o = iter.next() ;</p><p> o.println(str);</p><p><b> }</b></p><p><b> }<
39、;/b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> package org.pzhu.net.server.util;</p><p> impor
40、t java.io.PrintStream;</p><p> import java.net.Socket;</p><p> import java.util.ArrayList;</p><p> import java.util.Iterator;</p><p> import java.util.List;</p&g
41、t;<p> import org.pzhu.net.server.Server;</p><p> public class ListCO {//保存客戶端的連接</p><p> private List<Socket> list = null ;//通過鏈表保存</p><p> private List<P
42、rintStream> lout = null ;</p><p> public ListCO() throws Exception{</p><p> this.list = Server.list ;</p><p> lout = new ArrayList<PrintStream>() ;</p><p>
43、 Iterator<Socket> ilist = list.iterator() ;</p><p> while(ilist.hasNext()){</p><p> PrintStream out = null ;</p><p> Socket c = ilist.next() ;</p><p> out = n
44、ew PrintStream(c.getOutputStream()) ;</p><p> lout.add(out) ;</p><p><b> }</b></p><p><b> }</b></p><p> public List<PrintStream> getLo
45、ut() {</p><p> return lout;</p><p><b> }</b></p><p> public void setLout(List<PrintStream> lout) {</p><p> this.lout = lout;</p><p>&
46、lt;b> }</b></p><p><b> }</b></p><p> 2、客戶端的啟動如圖1.3、圖1.4:</p><p><b> 圖1.3</b></p><p> 分析:登錄界面先設(shè)置聊天使用的名字</p><p><b&g
47、t; 圖1.4</b></p><p> 分析:啟動時先輸入聊天姓名,然后才進(jìn)入聊天,這樣就可以進(jìn)行多人聊天了。</p><p><b> 主要代碼:</b></p><p> package org.pzhu.net.client;</p><p> import javax.swing.JFra
48、me;</p><p> import javax.swing.JTextArea;</p><p> import javax.swing.JLabel;</p><p> import javax.swing.JScrollPane;</p><p> import java.awt.Color;</p><p
49、> import java.awt.Font;</p><p> import javax.swing.JTextField;</p><p> import javax.swing.JButton;</p><p> import java.awt.event.ActionEvent;</p><p> import jav
50、a.awt.event.ActionListener;</p><p> import java.io.IOException;</p><p> import java.io.PrintStream;</p><p> import java.net.Socket;</p><p> public class clientAPP {
51、//客戶端界面</p><p> private JFrame frame;</p><p> private JTextField textField_1;</p><p> private JTextField textField_2 = new JTextField() ;</p><p> private final
52、JTextArea textArea = new JTextArea() ;</p><p> JLabel lblNewLabel = new JLabel();</p><p> JButton btnNewButton2 = null ;</p><p> private Socket client = null ;</p><p&g
53、t; private PrintStream out = null ;</p><p> private String name ;</p><p><b> /**</b></p><p> * Launch the application.</p><p><b> */</b><
54、;/p><p> public static void main(String[] args) {</p><p> clientAPP window = new clientAPP();</p><p> window.startAPP();</p><p><b> }</b></p><p&
55、gt;<b> /**</b></p><p> * Create the application.</p><p> * @return </p><p><b> */</b></p><p> public void startAPP() {//登錄界面</p>
56、<p> final JFrame f = new JFrame("聊天帥名") ;</p><p> f.getContentPane().setForeground(Color.GREEN);</p><p> f.getContentPane().setFont(new Font("新宋體", Font.BOLD, 20));&
57、lt;/p><p> f.setBounds(700, 320, 450, 300);</p><p> f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</p><p> f.getContentPane().setLayout(null);</p><p> JLabel lblNew
58、Label2 = new JLabel("\u8BF7 \u8BBE \u7F6E \u4F60 \u9017 \u540D");</p><p> lblNewLabel2.setForeground(Color.RED);</p><p> lblNewLabel2.setBackground(Color.RED);</p><p>
59、lblNewLabel2.setFont(new Font("新宋體", Font.BOLD, 25));</p><p> lblNewLabel2.setBounds(108, 23, 226, 50);</p><p> f.getContentPane().add(lblNewLabel2);</p><p> textField_
60、2.setForeground(Color.CYAN);</p><p> textField_2.setFont(new Font("新宋體", Font.BOLD, 22));</p><p> textField_2.setBounds(130, 97, 168, 41);</p><p> f.getContentPane().ad
61、d(textField_2);</p><p> textField_2.setColumns(10);</p><p> btnNewButton2 = new JButton("\u8FDB\u5165");</p><p> btnNewButton2.setFont(new Font("微軟雅黑", Font.B
62、OLD, 30));</p><p> btnNewButton2.setForeground(Color.BLUE);</p><p> btnNewButton2.setBounds(145, 165, 127, 41);</p><p> f.getContentPane().add(btnNewButton2);</p><p>
63、; f.setVisible(true);</p><p> btnNewButton2.addActionListener(new ActionListener(){</p><p><b> @Override</b></p><p> public void actionPerformed(ActionEvent e) {<
64、/p><p> frame.setVisible(true);//登錄后才顯示聊天界面</p><p> f.setVisible(false);//隱藏登錄界面</p><p> lblNewLabel.setText("我叫:"+textField_2.getText());</p><p><b&g
65、t; }</b></p><p><b> });</b></p><p><b> }</b></p><p> public clientAPP() {</p><p> initialize();</p><p><b> }</
66、b></p><p><b> /**</b></p><p> * Initialize the contents of the frame.</p><p><b> */</b></p><p> private void initialize() {//聊天界面<
67、/p><p> frame = new JFrame("逗比聊天室 by Puter");</p><p> frame.getContentPane().setFont(new Font("楷體", Font.BOLD, 18));</p><p> frame.getContentPane().setForegro
68、und(Color.BLACK);</p><p> frame.setForeground(Color.RED);</p><p> frame.setTitle("\u8BA8\u8BBA\u7EC4");</p><p> frame.setBounds(450, 150, 994, 631);</p><p>
69、; frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</p><p> frame.getContentPane().setLayout(null);</p><p> JLabel label = new JLabel("\u9017\u6BD4\u804A\u5929\u5BA4");</p>
70、;<p> label.setFont(new Font("楷體", Font.BOLD, 30));</p><p> label.setForeground(Color.RED);</p><p> label.setBounds(383, 23, 186, 50);</p><p> frame.getContentP
71、ane().add(label);</p><p> JScrollPane scrollPane = new JScrollPane();</p><p> scrollPane.setBounds(246, 110, 466, 332);</p><p> frame.getContentPane().add(scrollPane);</p>
72、<p> textArea.setBackground(Color.BLACK);</p><p> textArea.setFont(new Font("楷體", Font.BOLD, 17));</p><p> scrollPane.setViewportView(textArea);</p><p> textArea
73、.setEnabled(false);</p><p> final JButton btnNewButton = new JButton("\u53D1\u9001");</p><p> btnNewButton.setFont(new Font("宋體", Font.BOLD, 15));</p><p> btn
74、NewButton.setForeground(Color.GREEN);</p><p> btnNewButton.setBounds(629, 484, 83, 40);</p><p> frame.getContentPane().add(btnNewButton);</p><p> textField_1 = new JTextField();&
75、lt;/p><p> textField_1.setFont(new Font("楷體", Font.BOLD, 17));</p><p> textField_1.setBounds(246, 484, 361, 40);</p><p> frame.getContentPane().add(textField_1);</p>
76、<p> textField_1.setColumns(10);</p><p><b> try {</b></p><p> client = new Socket("localhost",8888) ;</p><p> } catch (IOException e) {</p>&
77、lt;p> e.printStackTrace();</p><p><b> }</b></p><p><b> try {</b></p><p> out = new PrintStream(client.getOutputStream()) ;</p><p> } cat
78、ch (IOException e) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p> new Thread(new OutInfo(this.textArea,client)).start();//線程時刻刷新聊天界面(客戶端的精華后面附上)</p>
79、<p> lblNewLabel.setForeground(Color.RED);</p><p> lblNewLabel.setFont(new Font("新宋體", Font.BOLD, 24));</p><p> lblNewLabel.setBounds(29, 115, 180, 40);</p><p> f
80、rame.getContentPane().add(lblNewLabel);</p><p> if(textField_1.getText() != null){</p><p> btnNewButton.addActionListener(new ActionListener(){</p><p><b> @Override</b&g
81、t;</p><p> public void actionPerformed(ActionEvent e) {</p><p> if(textField_1.getText() != null){</p><p> out.println(textField_2.getText()+"說:"+textField_1.getText())
82、;</p><p> textField_1.setText("");</p><p><b> }</b></p><p><b> }</b></p><p><b> });</b></p><p><b>
83、 }</b></p><p><b> }</b></p><p><b> }</b></p><p> package org.pzhu.net.client;</p><p> import java.io.BufferedReader;</p><p&
84、gt; import java.io.IOException;</p><p> import java.io.InputStreamReader;</p><p> import java.net.Socket;</p><p> import javax.swing.JTextArea;</p><p> public clas
85、s OutInfo implements Runnable {//客戶端的精華-實現(xiàn)部分</p><p> private JTextArea t = null ;//向界面顯示信息</p><p> private Socket client = null ;</p><p> private BufferedReader buf = null ;&
86、lt;/p><p> public OutInfo(JTextArea t,Socket client){</p><p> this.t = t ;</p><p> this.client = client ;//界面?zhèn)鬟^來實例化</p><p><b> }</b></p><p&g
87、t;<b> @Override</b></p><p> public void run() {//線程</p><p> boolean flag = true ;</p><p> String str = null ;</p><p><b> try {</b><
88、/p><p> buf = new BufferedReader(new InputStreamReader(client.getInputStream())) ;</p><p> } catch (IOException e) {</p><p> e.printStackTrace();</p><p><b> }<
89、;/b></p><p> while(flag){//一直監(jiān)聽服務(wù)器端口接收信息</p><p> synchronized(this){</p><p><b> try {</b></p><p> str = buf.readLine() ;//接收</p><p&g
90、t; } catch (IOException e) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p> if(str!=null){</p><p> System.out.println(str);</p><p>
91、 t.append(str+"\n");//顯示</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
92、<p><b> }</b></p><p><b> 五、結(jié)論</b></p><p> 收貨很多,學(xué)會了團(tuán)隊合作的重要性,也熟悉了業(yè)務(wù)開發(fā)流程,更重要的是這是對自己所學(xué)的一種總結(jié)。詞程序最主要困難的地方就是服務(wù)器要發(fā)給所有的客戶端,和客戶端要時刻更新接收到服務(wù)器的信息。</p><p><b&g
93、t; 六、實驗分工</b></p><p> 王科茗:55%(+-5%)</p><p> 馮嬌:45%(+-5%)</p><p><b> 七、參考文獻(xiàn)</b></p><p> [1]朱福喜.《Java語言程序設(shè)計》(第二版).科學(xué)出版社</p><p> [2]陳國
94、君等.《Java程序設(shè)計基礎(chǔ)》(第二版).清華大學(xué)出版社</p><p> [3] Deitel.《Java大學(xué)基礎(chǔ)教程》(第六版).電子工業(yè)出版社 </p><p> [4] MaryCampione.《Java語言導(dǎo)學(xué)》(第四版).機(jī)械工業(yè)出版社</p><p> [5] Y.Daniel Liang.《Java語言程序設(shè)計基礎(chǔ)篇》(第六版). 機(jī)械工業(yè)
95、出版社</p><p> [6] Kathy Sierra.《Head First Java》(第二版).東南大學(xué)出版社</p><p> 源代碼(先啟動服務(wù)器才能啟動客戶端,局域網(wǎng)內(nèi)通訊是客戶端的“l(fā)ocalhost”改為“服務(wù)器所在電腦的IP地址”):</p><p><b> 服務(wù)器:</b></p><p>
96、; package org.pzhu.net.server;</p><p> import java.io.IOException;</p><p> import java.net.ServerSocket;</p><p> import java.net.Socket;</p><p> import java.util.A
97、rrayList;</p><p> import java.util.List;</p><p> import org.pzhu.net.server.thread.ThreadServer;</p><p> public class Server {</p><p> private ServerSocket server =
98、 null ;</p><p> public static List<Socket> list = new ArrayList<Socket>() ;</p><p> private Socket client = null ;</p><p> private int count = 0 ;</p><p>
99、; public Server(){</p><p><b> try {</b></p><p> server = new ServerSocket(8888) ;</p><p> } catch (IOException e1) {</p><p> e1.printStackTrace();</
100、p><p><b> }</b></p><p> System.out.println("等待服務(wù)器被連接······");</p><p> boolean flag = true ;</p><p> while(flag){<
101、;/p><p> synchronized(this){</p><p><b> try {</b></p><p> client = server.accept() ;</p><p><b> count++;</b></p><p> } catch (IOE
102、xception e1) {</p><p> e1.printStackTrace();</p><p><b> }</b></p><p> list.add(client) ;</p><p> System.out.println("第"+count+"客戶端被連接!&qu
103、ot;);</p><p><b> try {</b></p><p> new Thread(new ThreadServer(client)).start();</p><p> } catch (Exception e) {</p><p> e.printStackTrace();</p>
104、<p> flag = false ;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> try {</b></p><p&
105、gt; server.close();</p><p> } catch (IOException e) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p><b> }</b></p><p>&l
106、t;b> }</b></p><p> package org.pzhu.net.server.start;</p><p> import org.pzhu.net.server.Server;</p><p> public class ServerStart {</p><p> public static
107、void main(String[] args) {</p><p> new Server();</p><p><b> }</b></p><p><b> }</b></p><p> package org.pzhu.net.server.thread;</p>&l
108、t;p> import java.io.BufferedReader;</p><p> import java.io.InputStreamReader;</p><p> import java.io.PrintStream;</p><p> import java.net.Socket;</p><p> import
109、 java.util.Iterator;</p><p> import org.pzhu.net.server.util.ListCO;</p><p> public class ThreadServer implements Runnable{</p><p> private BufferedReader buf = null ;</p>
110、<p> private Socket client = null ;</p><p> public ThreadServer(Socket client) throws Exception{</p><p> this.client = client ;</p><p> buf = new BufferedReader(new Input
111、StreamReader(this.client.getInputStream())) ;</p><p><b> }</b></p><p><b> @Override</b></p><p> public void run(){</p><p> String str = null
112、 ;</p><p> boolean f = true ;</p><p><b> while(f){</b></p><p><b> try {</b></p><p> str = buf.readLine() ;</p><p> } catch (Ex
113、ception e) {</p><p> f = false ;</p><p><b> }</b></p><p> if("bye".equals(str)){</p><p> f = false ;</p><p><b> }else{<
114、/b></p><p> ListCO lout = null ;</p><p><b> try {</b></p><p> lout = new ListCO();</p><p> } catch (Exception e) {</p><p> e.printStack
115、Trace();</p><p><b> }</b></p><p> Iterator<PrintStream> iter = lout.getLout().iterator();</p><p> while(iter.hasNext()){</p><p> PrintStream o = i
116、ter.next() ;</p><p> o.println(str);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b&g
117、t;</p><p><b> }</b></p><p> package org.pzhu.net.server.util;</p><p> import java.io.PrintStream;</p><p> import java.net.Socket;</p><p>
118、import java.util.ArrayList;</p><p> import java.util.Iterator;</p><p> import java.util.List;</p><p> import org.pzhu.net.server.Server;</p><p> public class ListCO
119、 {</p><p> private List<Socket> list = null ;</p><p> private List<PrintStream> lout = null ;</p><p> public ListCO() throws Exception{</p><p> this.lis
120、t = Server.list ;</p><p> lout = new ArrayList<PrintStream>() ;</p><p> Iterator<Socket> ilist = list.iterator() ;</p><p> while(ilist.hasNext()){</p><p>
121、; PrintStream out = null ;</p><p> Socket c = ilist.next() ;</p><p> out = new PrintStream(c.getOutputStream()) ;</p><p> lout.add(out) ;</p><p><b> }</b&
122、gt;</p><p><b> }</b></p><p> public List<PrintStream> getLout() {</p><p> return lout;</p><p><b> }</b></p><p> public v
123、oid setLout(List<PrintStream> lout) {</p><p> this.lout = lout;</p><p><b> }</b></p><p><b> }</b></p><p><b> 客戶端:</b></
124、p><p> package org.pzhu.net.client;</p><p> import javax.swing.JFrame;</p><p> import javax.swing.JTextArea;</p><p> import javax.swing.JLabel;</p><p> i
125、mport javax.swing.JScrollPane;</p><p> import java.awt.Color;</p><p> import java.awt.Font;</p><p> import javax.swing.JTextField;</p><p> import javax.swing.JButto
126、n;</p><p> import java.awt.event.ActionEvent;</p><p> import java.awt.event.ActionListener;</p><p> import java.io.IOException;</p><p> import java.io.PrintStream;&
127、lt;/p><p> import java.net.Socket;</p><p> public class clientAPP {</p><p> private JFrame frame;</p><p> private JTextField textField_1;</p><p> private
128、 JTextField textField_2 = new JTextField() ;</p><p> private final JTextArea textArea = new JTextArea() ;</p><p> JLabel lblNewLabel = new JLabel();</p><p> JButton btnNewButton2
129、 = null ;</p><p> private Socket client = null ;</p><p> private PrintStream out = null ;</p><p> private String name ;</p><p><b> /**</b></p>&l
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- java課程設(shè)計聊天小程序
- java課程設(shè)計報告--聊天小程序
- java課程設(shè)計--簡單的網(wǎng)絡(luò)聊天程序
- 局域網(wǎng)聊天程序java課程設(shè)計
- java課程設(shè)計---即時聊天系統(tǒng)
- java課程設(shè)計--局域網(wǎng)聊天程序的設(shè)計與實現(xiàn)
- java課程設(shè)計---局域網(wǎng)聊天程序的設(shè)計與實現(xiàn)
- java課程設(shè)計---局域網(wǎng)聊天程序的設(shè)計與實現(xiàn)
- java網(wǎng)絡(luò)聊天室課程設(shè)計
- java課程設(shè)計---聊天室系統(tǒng)
- java課程設(shè)計--聊天室系統(tǒng)
- java課程設(shè)計---java程序設(shè)計
- java課程設(shè)計--java程序設(shè)計
- java課程設(shè)計--java面向?qū)ο蟪绦蛟O(shè)計課程設(shè)計
- mfc聊天軟件課程設(shè)計---網(wǎng)絡(luò)聊天程序設(shè)計
- mfc聊天軟件課程設(shè)計---網(wǎng)絡(luò)聊天程序設(shè)計
- 網(wǎng)絡(luò)編程課程設(shè)計-java聊天室
- java課程設(shè)計之簡單聊天室
- java課程設(shè)計報告---利用java實現(xiàn)簡單聊天室
- java抽獎程序課程設(shè)計
評論
0/150
提交評論