版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 一、課題內(nèi)容和要求</b></p><p><b> 1.課題內(nèi)容</b></p><p> 基于TCP和多線程編程的聊天程序?qū)崿F(xiàn)</p><p><b> 2.課題要求</b></p><p> 網(wǎng)絡(luò)聊天程序設(shè)計非常復雜,允許多個人同時聊
2、天更加需要多線程技術(shù)的支持,請實現(xiàn)一個簡單的多線程網(wǎng)絡(luò)聊天程序模擬。</p><p><b> 二、設(shè)計思路分析</b></p><p> 1. 在網(wǎng)絡(luò)越來越發(fā)達的今天,人們對網(wǎng)絡(luò)的依賴越來越強,網(wǎng)絡(luò)聊天已經(jīng)成了許多人生活中必不可少的一部分,基于這樣的需求,出現(xiàn)了許多網(wǎng)絡(luò)聊天通信工具,像QQ,MSN等等,但是人們已經(jīng)不再滿足于單
3、一的兩個人之間的聊天,而是對多人同時聊天產(chǎn)生了興趣,于是出現(xiàn)了網(wǎng)絡(luò)聊天室,不同地方的人可以在那個虛擬的聊天室里面熱烈聊天?;谶@樣的想法,我們用JAVA設(shè)計一個多人同時聊天的小程序,用Socket編程實現(xiàn)網(wǎng)絡(luò)通訊,面向連接的,采用多線程的實現(xiàn)技術(shù)。</p><p> 2. 在程序中,可以設(shè)置加入連接的最大數(shù)目,通過更改IP地址和端口號,成為不同的客戶端,與服務器端連接,進行多
4、用戶聊天。</p><p> 3. 為方便用戶交互,我們采用圖形化的用戶界面。實現(xiàn)了好友添加,消息收發(fā)、顯示等基本功能。</p><p><b> 三、概要設(shè)計</b></p><p> 該網(wǎng)絡(luò)聊天程序大致分為三個主要部分:客戶端、服務器端和用戶圖形界面。而運行在不同的機器上的進程是通過向套接字發(fā)送報文
5、來通訊的。各個部分的初步設(shè)計思想、流程及存儲結(jié)構(gòu)如下:</p><p> 程序整體框架:主程序監(jiān)聽一端口,等待客戶接入;同時構(gòu)造一個線程類,準備接管會話。當一個Socket會話產(chǎn)生后,將這個會話交給線程處理,然后主程序繼續(xù)監(jiān)聽。而進程通過TCP套接字實現(xiàn)通信的示意圖如下所示:</p><p><b> .</b></p><p> 客戶機
6、/服務器應用程序使用面向連接的設(shè)計思路:</p><p> 服務器 客戶端</p><p><b> .</b></p><p> 2. 客戶端(Client)</p><p> 客戶端,使用Sock
7、et對網(wǎng)絡(luò)上某一個服務器的某一個端口發(fā)出連接請求,一旦連接成功,打開會話;會話完成后,關(guān)閉Socket。客戶端不需要指定打開的端口,通常臨時的、動態(tài)的分配一個端口。</p><p> 3. 服務器端(Server)</p><p> 服務器端,使用ServerSocket監(jiān)聽指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些
8、操作系統(tǒng)中不可以隨意使用,所以建議使用大于1024的端口),等待客戶連接請求,客戶連接后,會話產(chǎn)生;在完成會話后,關(guān)閉連接。</p><p> 4. 用戶圖形界面</p><p> 用戶圖形界面方便程序與用戶的交互,多個用戶參加,完成會話功能,具體的設(shè)計要方便用戶的使用,直觀清晰,簡潔明了,友好美觀。</p><p> 5.
9、 存儲結(jié)構(gòu)</p><p> 下面列出主要存儲結(jié)構(gòu)或變量:</p><p><b> 四、詳細設(shè)計</b></p><p> 代碼分服務器端、客戶端、和用戶圖形界面三部分,分別如下:</p><p><b> 1.服務器端</b></p>&
10、lt;p> 服務器端主要是使用ServerSocket類,相當于服務器Socket,用來監(jiān)聽試圖進入的連接,當新的連接建立后,該類為他們實例化一個Socket對象,同時得到輸入輸出流,調(diào)用相應方法完成會話。</p><p><b> 具體代碼如下:</b></p><p> package nupt.java.socket;</p><
11、p> import java.awt.*;</p><p> import java.net.*;</p><p> import java.io.*;</p><p> public class Server extends Thread {</p><p> ServerSocket skt; //
12、 ServerSocket類監(jiān)聽進入的連接,為每個新的連接產(chǎn)生一個Socket對象 </p><p> Socket Client[ ]=new Socket[10];</p><p> Socket Client1=null;</p><p> int i = 0;</p>
13、<p> TextArea in;</p><p> int port,k=0,l=0;</p><p> PrintStream theOutputStream;</p><p> Face chat;</p><p> public Server(int port, Face chat) {</p>&l
14、t;p><b> try {</b></p><p> this.port = port;</p><p> skt = new ServerSocket(port);</p><p> this.chat = chat;</p><p> } catch (IOException e) {</p&
15、gt;<p> chat.ta.append(e.toString());</p><p><b> }</b></p><p><b> }</b></p><p> public void run() {</p><p> chat.ta.append("等待連
16、線......");</p><p> while (true) {</p><p><b> try {</b></p><p> Client[k] = skt.accept();</p><p> //當有客戶端連接時就新建一個子線程</p><p> if (i <
17、; 2) {</p><p> ServerThread server[] = new ServerThread[10];</p><p> server[k]= new ServerThread(Client[k], this.chat, i);</p><p> l=server.length;</p><p> server[k
18、].start();</p><p> chat.ta.append(“客戶端“+ Client[k].getInetAddress() + "已連線\n");</p><p> //for(int j=0;j<server.length;j++)</p><p> theOutputStream = new PrintStream(
19、server[k].getClient().getOutputStream());</p><p> i = server[k].getI();</p><p><b> k++;</b></p><p><b> } else {</b></p><p> //theOutputStrea
20、m = new PrintStream(null);</p><p><b> }</b></p><p> } catch (SocketException e) {</p><p> } catch (IOException e) {</p><p> chat.ta.append(e.toString())
21、;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> public void dataout(String data) {</p><p> //for(int
22、j=0;j<l;j++)</p><p> theOutputStream.println(data);</p><p><b> }</b></p><p><b> }</b></p><p> class ServerThread extends Thread {</p&g
23、t;<p> ServerSocket skt;</p><p> Socket Client;</p><p> TextArea in;</p><p> int port,i;</p><p> BufferedReader theInputStream;</p><p> PrintS
24、tream theOutputStream;</p><p> String readin;</p><p> Face chat;</p><p><b> //服務端子線程</b></p><p> public ServerThread(Socket s, Face chat, int i) {</p
25、><p> this.i = ++i;</p><p> Client = s;</p><p> this.chat = chat;</p><p><b> }</b></p><p> public int getI() {</p><p> return t
26、his.i;</p><p><b> }</b></p><p> public Socket getClient() {</p><p> return this.Client;</p><p><b> }</b></p><p> public void r
27、un() {</p><p><b> try {</b></p><p> theInputStream = new BufferedReader(new InputStreamReader(Client</p><p> .getInputStream()));</p><p> theOutputStrea
28、m = new PrintStream(Client.getOutputStream());</p><p> while (true) {</p><p> readin = theInputStream.readLine();</p><p> chat.ta.append(readin + "\n");</p><
29、p><b> }</b></p><p> } catch (SocketException e) {</p><p> chat.ta.append("連線中斷!\n");</p><p> // 設(shè)置組件可用性</p><p> chat.clientBtn.setEnabled(
30、true);</p><p> chat.serverBtn.setEnabled(true);</p><p> chat.tfaddress.setEnabled(true);</p><p> chat.tfport.setEnabled(true);</p><p><b> try {</b></
31、p><p><b> i - -;</b></p><p> skt.close();</p><p> Client.close();</p><p> } catch (IOException err) {</p><p> chat.ta.append(err.toString());
32、</p><p><b> }</b></p><p> } catch (IOException e) {</p><p> chat.ta.append(e.toString());</p><p><b> }</b></p><p><b> }&
33、lt;/b></p><p> public void dataout(String data) {</p><p> theOutputStream.println(data);</p><p><b> }</b></p><p><b> }</b></p><
34、;p><b> 2.客戶端</b></p><p> 客戶端主要是使用Socket類,該類是JAVA實現(xiàn)網(wǎng)絡(luò)編程重要的基礎(chǔ)類,實現(xiàn)程序間雙向的面向連接的通信。調(diào)用public Socket(String host,int port)方法設(shè)定IP和端口。建好連接后,用戶通過得到Socket的輸入輸出流對象后,利用流的方法實現(xiàn)數(shù)據(jù)的傳輸。調(diào)用public InputStream get
35、InputStream()和public OutputStream getOutputStream()方法,分別得到Socket對象的輸入輸出流;</p><p><b> 具體實現(xiàn)代碼如下:</b></p><p> package nupt.java.socket;</p><p> import java.net.*;</p&
36、gt;<p> import java.io.*;</p><p> import javax.swing.Timer;</p><p> public class Client extends Thread {</p><p> Socket skt;
37、0; // 用于客戶端的連接</p><p> InetAddress host;
38、0; // 主機地址</p><p> int port;
39、0; // 端口號</p><p> BufferedReader theInputStream;&l
40、t;/p><p> PrintStream theOutputStream;</p><p> String readin;</p><p> Face chat;</p><p> public Client(String ip, int p, Face chat) {</p><p><b> tr
41、y {</b></p><p> host = InetAddress.getByName(ip); // 獲取IP地址</p><p> port = p; &
42、#160;
43、; // 獲取端口號</p><p> this.chat = chat;</p><p> } catch (IOException e) {</p><p> chat.ta.append(e.toString());</p><p><b> }</b&
44、gt;</p><p><b> }</b></p><p> public void run() {</p><p><b> try {</b></p><p> chat.ta.append("準備連線,稍后!");</p><p> sk
45、t = new Socket(host, port); // 新建Socket對象</p><p> chat.ta.append("成功\n");
46、60; // 緩沖區(qū)末尾添加字符串</p><p> theInputStream = new BufferedReader(new InputStreamReader(skt.getInputStream()
47、));</p><p> theOutputStream = new PrintStream(skt.getOutputStream());</p><p> while (true) {</p><p> readin = theInputStream.readLine();</p><p> chat.ta.append(read
48、in + "\n");</p><p><b> }</b></p><p> } catch (SocketException e) {</p><p> chat.ta.append("未連上!\n");</p><p> chat.clientBtn.setEnabl
49、ed(true);</p><p> chat.serverBtn.setEnabled(true);</p><p> chat.tfaddress.setEnabled(true);</p><p> chat.tfport.setEnabled(true);</p><p><b> try {</b>&l
50、t;/p><p> skt.close();</p><p> } catch (IOException err) {</p><p> chat.ta.append(err.toString());</p><p><b> }</b></p><p> } catch (IOExcept
51、ion e) {</p><p> chat.ta.append(e.toString());</p><p><b> }</b></p><p><b> }</b></p><p> public void dataout(String data) {</p><p
52、> theOutputStream.println(data);</p><p><b> }</b></p><p><b> }</b></p><p><b> 3.用戶圖形界面</b></p><p> 該部分主要是完成界面的初始化,合理布局組件,方便用
53、戶交互。主要是JAVA按鈕,文本域,標簽,布局管理器的使用。主要處理了鍵盤Enter消息接受,下面是實現(xiàn)代碼:</p><p> package nupt.java.socket;</p><p> import java.awt.*;</p><p> import java.awt.event.*;</p><p> public
54、 class Face extends Frame {</p><p> private static final long serialVersionUID = 1L;</p><p> Button clientBtn, serverBtn;</p><p> TextArea ta;</p><p> TextField tfa
55、ddress, tfport, tftype;</p><p> Label lbl1,lbl2,lbl3;</p><p><b> int port;</b></p><p> Client client;</p><p> Server server;</p><p> boole
56、an iamserver;</p><p> static Face frm;</p><p> public Face() {</p><p><b> // 實例化組件</b></p><p> clientBtn = new Button("客戶端");</p><p
57、> serverBtn = new Button("服務器");</p><p> ta = new TextArea("", 10, 50, TextArea.SCROLLBARS_BOTH);</p><p> lbl1 = new Label("IP地址:");</p><p> tfa
58、ddress = new TextField("192.168.1.104", 10);</p><p> lbl2 = new Label("端口:");</p><p> tfport = new TextField("8080");</p><p> lbl3 = new Label("
59、;發(fā)送內(nèi)容:");</p><p> tftype = new TextField(40);</p><p> tftype.addKeyListener(new TFListener());</p><p> ta.setEditable(false);</p><p> //向容器中加入以上組件</p>&
60、lt;p> setLayout(new FlowLayout());</p><p> add(lbl1);</p><p> add(tfaddress);</p><p> add(lbl2);</p><p> add(tfport);</p><p> add(clie
61、ntBtn);</p><p> add(serverBtn);</p><p><b> add(ta);</b></p><p> add(lbl3);</p><p> add(tftype);</p><p><b> //設(shè)置格式</b></p>
62、;<p> setLocation(400, 250); //窗口顯示再屏幕的位置坐標</p><p> setSize(400, 300);
63、160; //設(shè)置窗體大小</p><p> setTitle("基于Socket和多線程編程的聊天程序");</p><p> this.setVisible(true); &
64、#160; //設(shè)置窗體可見</p><p><b> //事件響應</b></p><p> clientBtn.addActionListener(new ActionListene
65、r() {</p><p> public void actionPerformed(ActionEvent e) {</p><p> port = Integer.parseInt(tfport.getText());</p><p> client = new Client(tfaddress.getText(), port, frm);</p&g
66、t;<p> client.start();</p><p> tfaddress.setEnabled(false);</p><p> tfport.setEnabled(false);</p><p> serverBtn.setEnabled(false);</p><p> clientBtn.setEnab
67、led(false);</p><p><b> }</b></p><p><b> });</b></p><p> serverBtn.addActionListener(new ActionListener() {</p><p> public void actionPerform
68、ed(ActionEvent e) {</p><p> port = Integer.parseInt(tfport.getText());</p><p> server = new Server(port, frm);</p><p> server.start();</p><p> iamserver = true;<
69、/p><p> tfaddress.setText("成為服務器");</p><p> tfaddress.setEnabled(false);</p><p> tfport.setEnabled(false);</p><p> serverBtn.setEnabled(false);</p>&l
70、t;p> clientBtn.setEnabled(false);</p><p><b> }</b></p><p><b> });</b></p><p> addWindowListener(new WindowAdapter() {</p><p> public voi
71、d windowClosing(WindowEvent e) {</p><p> System.exit(0);</p><p><b> }</b></p><p><b> });</b></p><p><b> }</b></p><p&g
72、t; public static void main(String[] args) { //主方法</p><p> // TODO Auto-generated method stub</p><p> frm = new Face();</p><p><b>
73、 }</b></p><p> private class TFListener implements KeyListener {</p><p> public void keyPressed(KeyEvent e) {</p><p> if (e.getKeyCode() == KeyEvent.VK_ENTER) { //按Enter輸出顯
74、示聊天內(nèi)容</p><p> ta.append(">" + tftype.getText() + "\n");</p><p> if (iamserver)</p><p> server.dataout(tftype.getText());</p><p><b> els
75、e</b></p><p> client.dataout(tftype.getText());</p><p> tftype.setText("");</p><p><b> }</b></p><p><b> }</b></p><
76、;p> public void keyTyped(KeyEvent e) {</p><p><b> }</b></p><p> public void keyReleased(KeyEvent e) {</p><p><b> }</b></p><p><b>
77、}</b></p><p><b> }</b></p><p><b> 實驗思考與總結(jié)</b></p><p> 由于對java編程的不熟,所以我們在編程過程中遇到了很大的困難,但通過向老師同學們請教與及查閱資料,我們還是有了解決方案。所以在這次實驗中,我們對java有了初步了解,學得了很多東西。明白
78、了java是個很強大的編程工具。</p><p> 這個學期我們剛剛學習了計算機網(wǎng)絡(luò)通信方面的知識,對于socket套接字的原理,計算機進程的通信過程有比較熟悉的了解,所以這次課題活動讓我們又對TCP的運行,計算機通信通過編程實現(xiàn)方面有了更好的了解,更加鞏固了以前學習的知識。</p><p> 3、通過觀察我們也看到了,在本次課程設(shè)計中的這個編程程序雖然它實現(xiàn)了聊天的功能,但是它只能是
79、一對一的聊天,因為TCP連接決定了不可能實現(xiàn)一對多的連接。但是我們現(xiàn)在的各種聊天軟件不僅可以實現(xiàn)一對多的連接,有的甚至可以實現(xiàn)最大化的一對多的視頻聊天。所以我們的這個課程設(shè)計所做到的還是很粗淺的層次,還有很多需要改進的地方和空間!希望我們以后再次做到相關(guān)的課題時我們不僅能在外觀上使它更美化,而且在功能能更上一層樓!</p><p> 4、這次課題活動,是我們對于網(wǎng)路通信有了更好了解,比如就TCP的三次握手協(xié)議,
80、面向連接的服務等。激發(fā)了我們對于計算機網(wǎng)絡(luò)通信的學習興趣。</p><p><b> 參考資料</b></p><p> 《計算機網(wǎng)絡(luò)——自頂向下方法》(美James K.Kouse ,Keith W.Ross著,陳鳴 譯,機械工業(yè)出版社)</p><p> 《用TCP/IP進行網(wǎng)際互連》(美Douglas E.Comer 著,謝希仁等譯
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計--基于tcp的計算機通信工具編程實現(xiàn)
- 課程設(shè)計----點對點通信計算機的實現(xiàn)
- 計算機網(wǎng)絡(luò)課程設(shè)計-編程實現(xiàn)簡單的tcp協(xié)議分析器
- 計算機網(wǎng)絡(luò)課程設(shè)計--基于tcp協(xié)議編程的網(wǎng)絡(luò)聊天室
- 計算機網(wǎng)絡(luò)課程設(shè)計--編程實現(xiàn)基于udp的ping
- 課程設(shè)計---通信系統(tǒng)的計算機仿真設(shè)計
- 校園計算機通信網(wǎng)課程設(shè)計
- 網(wǎng)絡(luò)課程設(shè)計報告----基于tcp的點對點即時通信工具
- 課程設(shè)計---遠程登錄的計算機實現(xiàn)
- 計算機網(wǎng)絡(luò)課程設(shè)計tcp數(shù)據(jù)包
- 計算機組成原理課程設(shè)計-- 模型計算機的設(shè)計與實現(xiàn)
- 利用socket實現(xiàn)雙機通信(計算機網(wǎng)絡(luò)課程設(shè)計)
- 計算機組成原理課程設(shè)計——模型計算機的設(shè)計與實現(xiàn)
- 數(shù)字通信計算機仿真課程設(shè)計報告
- 計算機科學與編程導論課程設(shè)計參考設(shè)計題目
- 計算機科學與編程導論課程設(shè)計參考設(shè)計題目
- 計算機科學與編程導論課程設(shè)計參考設(shè)計題目
- 計算機網(wǎng)絡(luò)課程設(shè)計---tcp 協(xié)議優(yōu)化方法研究
- 計算機網(wǎng)絡(luò)課程設(shè)計-掃描正在服務的tcp端口
- 計算機原理課程設(shè)計
評論
0/150
提交評論