版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 基于TCP協(xié)議編程的網(wǎng)絡(luò)聊天室</p><p><b> 一、題目要求</b></p><p><b> (一)設(shè)計(jì)內(nèi)容</b></p><p> 基于TCP協(xié)議編程的方式,編寫程序模擬網(wǎng)絡(luò)聊天室的運(yùn)行過程。</p><p><b> (二)設(shè)計(jì)要求</
2、b></p><p> 1.采用C/S模式,基于TCP協(xié)議編程的方式,使得各個用戶通過服務(wù)器轉(zhuǎn)發(fā)實(shí)現(xiàn)聊天的功能。</p><p> 2.分為兩大模塊:客戶端模塊和服務(wù)器端模塊。</p><p> 3.客戶端模塊的主要功能:</p><p> 1)登陸功能:用戶可以注冊,然后選擇服務(wù)器登入聊天室。</p><p
3、> 2)顯示用戶:將在線用戶顯示在列表中。</p><p> 3)接收信息:能接收其他用戶發(fā)出的信息。</p><p> 4)發(fā)送信息:能發(fā)出用戶要發(fā)出的信息。</p><p> 4.服務(wù)器端模塊的主要功能:</p><p> 1)檢驗(yàn)登陸信息:檢查登陸信息是否正確,并向客戶端返回登陸信息,如信息正確。就允許用戶登陸。<
4、/p><p> 2)顯示在線狀態(tài):將該用戶的狀態(tài)發(fā)給各在線用戶。</p><p> 3)轉(zhuǎn)發(fā)聊天信息:將消息轉(zhuǎn)發(fā)給所有在線的用戶。</p><p><b> 5.編程語言不限。</b></p><p><b> 二、需求分析</b></p><p> 在客戶端界面,要實(shí)
5、現(xiàn)用戶登陸和注冊功能,登陸和注冊要檢驗(yàn)名稱;當(dāng)用戶成功登陸時,可以通過用戶在線列表查看在線的用戶;當(dāng)用戶發(fā)送信息時,有一定的要求,比如必須有用戶在線,并且內(nèi)容不能為空時,才可以成功發(fā)送信息,發(fā)送的信息可以顯示在消息顯示列表中,接收到的消息也可以顯示在消息列表中。</p><p> 在服務(wù)器端界面,要實(shí)現(xiàn)用戶登陸信息的檢驗(yàn),并且能夠向客戶端返回登陸信息,如果信息正確,則用戶可以登陸,否則,不能登陸,在服務(wù)器端界面
6、,可以顯示所有用戶的狀態(tài)信息,并且將用戶的狀態(tài)發(fā)送給在線用戶查看。</p><p><b> 三、模塊劃分</b></p><p><b> ?。ㄒ唬┛蛻舳四K</b></p><p> 1、連接服務(wù)器(登陸)功能:在客戶端對應(yīng)的文本框中輸入要連接的端口號,服務(wù)器IP,和用戶名,點(diǎn)擊連接按鈕,顯示成功連接,用戶登陸成功
7、。</p><p> 2、顯示用戶:當(dāng)用戶連接到服務(wù)器時,將會顯示在服務(wù)器及在線用戶的列表中。</p><p> 3、接收/發(fā)送信息:在客戶端寫消息文本框中輸入要發(fā)送的消息,點(diǎn)擊發(fā)送按鈕,即可在消息顯示列表中顯示要發(fā)送的消息。</p><p> 4、斷開服務(wù)器功能:在客戶端點(diǎn)擊斷開按鈕,即可斷開與服務(wù)器的連接。</p><p><
8、b> ?。ǘ┓?wù)器模塊</b></p><p> 1、啟動服務(wù)器:在服務(wù)器端輸入要啟動的端口號以及人數(shù)上限,點(diǎn)擊啟動按鈕,顯示服務(wù)器成功啟動。</p><p> 2、停止服務(wù)器:在服務(wù)器端點(diǎn)擊停止按鈕,顯示服務(wù)器成功停止,即可停止相應(yīng)的服務(wù)器端口。</p><p> 3、顯示在線用戶:當(dāng)用戶成功登陸后,可在在線用戶文本框中顯示在線用戶信息。
9、</p><p> 4、發(fā)送消息:在服務(wù)器端寫消息文本框中輸入要發(fā)送的消息,點(diǎn)擊發(fā)送按鈕,在消息顯示區(qū)即可顯示發(fā)送的消息。</p><p> 5、人數(shù)上限:當(dāng)在線用戶已達(dá)上限時,其他用戶將不能連接到此聊天室。</p><p><b> 四、實(shí)現(xiàn)思路</b></p><p> ?。ㄒ唬┛傮w功能結(jié)構(gòu)圖</p>
10、;<p><b> 客戶端</b></p><p><b> ?。?)關(guān)鍵代碼</b></p><p> textArea = new JTextArea();</p><p> textArea.setEditable(false);</p><p> textArea.se
11、tForeground(Color.blue);</p><p> textField = new JTextField();</p><p> txt_port = new JTextField("8888");</p><p> txt_hostIp = new JTextField("127.0.0.1");<
12、;/p><p> txt_name = new JTextField("lily");</p><p> btn_start = new JButton("連接");</p><p> btn_stop = new JButton("斷開");</p><p> btn_send
13、 = new JButton("發(fā)送");</p><p> listModel = new DefaultListModel();</p><p> userList = new JList(listModel);</p><p> northPanel = new JPanel();</p><p> nort
14、hPanel.setLayout(new GridLayout(1, 7));</p><p> northPanel.add(new JLabel("端口號"));</p><p> northPanel.add(txt_port);</p><p> northPanel.add(new JLabel("服務(wù)器IP"
15、));</p><p> northPanel.add(txt_hostIp);</p><p> northPanel.add(new JLabel("姓名"));</p><p> northPanel.add(txt_name);</p><p> northPanel.add(btn_start);<
16、/p><p> northPanel.add(btn_stop);</p><p> northPanel.setBorder(new TitledBorder("連接信息"));</p><p> rightScroll = new JScrollPane(textArea);</p><p> rightScrol
17、l.setBorder(new TitledBorder("消息顯示區(qū)"));</p><p> leftScroll = new JScrollPane(userList);</p><p> leftScroll.setBorder(new TitledBorder("在線用戶"));</p><p> southP
18、anel = new JPanel(new BorderLayout());</p><p> southPanel.add(textField, "Center");</p><p> southPanel.add(btn_send, "East");</p><p> southPanel.setBorder(new
19、 TitledBorder("寫消息"));</p><p> centerSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftScroll,</p><p> rightScroll);</p><p> centerSplit.setDividerLocation(100);&
20、lt;/p><p> frame = new JFrame("客戶端");</p><p> // 更改JFrame的圖標(biāo):</p><p> frame.setIconImage(Toolkit.getDefaultToolkit().createImage(</p><p> ClientPort.class.ge
21、tResource("test.jpg")));</p><p> frame.setLayout(new BorderLayout());</p><p> frame.add(northPanel, "North");</p><p> frame.add(centerSplit, "Center"
22、;);</p><p> frame.add(southPanel, "South");</p><p> frame.setSize(600, 400);</p><p> int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width;</p>&l
23、t;p> int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height;</p><p> frame.setLocation((screen_width - frame.getWidth()) / 2,</p><p> (screen_height - frame.getHeight()) /
24、2);</p><p> frame.setVisible(true);</p><p><b> 界面截圖</b></p><p><b> 服務(wù)器端</b></p><p><b> ?。?)關(guān)鍵代碼</b></p><p> frame =
25、 new JFrame("服務(wù)器"); frame.setIconImage(Toolkit.getDefaultToolkit().createImage(ServerPort.class.getResource("test.jpg")));</p><p> contentArea = new JTextArea(); </p>&
26、lt;p> contentArea.setEditable(false); </p><p> contentArea.setForeground(Color.blue); </p><p> txt_message = new JTextField(); </p><p> txt_max = new JTextField("100&
27、quot;); </p><p> txt_port = new JTextField("8888"); </p><p> btn_start = new JButton("啟動"); </p><p> btn_stop = new JButton("停止"); </p>&
28、lt;p> btn_send = new JButton("發(fā)送"); </p><p> btn_stop.setEnabled(false); </p><p> listModel = new DefaultListModel(); </p><p> userList = new JList(listModel);
29、</p><p> southPanel = new JPanel(new BorderLayout()); </p><p> southPanel.setBorder(new TitledBorder("寫消息")); </p><p> southPanel.add(txt_message, "Center")
30、; </p><p> southPanel.add(btn_send, "East"); </p><p> leftPanel = new JScrollPane(userList); </p><p> leftPanel.setBorder(new TitledBorder("在線用戶")); </
31、p><p> rightPanel = new JScrollPane(contentArea); </p><p> rightPanel.setBorder(new TitledBorder("消息顯示區(qū)")); </p><p> centerSplit = new JSplitPane(JSplitPane.HORIZONTAL_S
32、PLIT, leftPanel, </p><p> rightPanel); </p><p> centerSplit.setDividerLocation(100); </p><p> northPanel = new JPanel(); </p><p> northPanel.setLayout(new GridL
33、ayout(1, 6)); </p><p> northPanel.add(new JLabel("人數(shù)上限")); </p><p> northPanel.add(txt_max); </p><p> northPanel.add(new JLabel("端口")); </p><p&
34、gt; northPanel.add(txt_port); </p><p> northPanel.add(btn_start); </p><p> northPanel.add(btn_stop); </p><p> northPanel.setBorder(new TitledBorder("配置信息")); </
35、p><p> frame.setLayout(new BorderLayout()); </p><p> frame.add(northPanel, "North"); </p><p> frame.add(centerSplit, "Center"); </p><p> frame.a
36、dd(southPanel, "South"); </p><p> frame.setSize(600, 400); </p><p> //frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());//設(shè)置全屏 </p><p> int screen_width = T
37、oolkit.getDefaultToolkit().getScreenSize().width; </p><p> int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height; </p><p> frame.setLocation((screen_width - frame.getWidth()
38、) / 2, </p><p> (screen_height - frame.getHeight()) / 2); </p><p> frame.setVisible(true); </p><p> // 關(guān)閉窗口時事件 </p><p> frame.addWindowListener(new WindowAdapte
39、r() { </p><p> public void windowClosing(WindowEvent e) { </p><p> if (isStart) { </p><p> closeServer();// 關(guān)閉服務(wù)器 </p><p><b> } </b></p><
40、;p> System.exit(0);// 退出程序 </p><p><b> } </b></p><p><b> }); </b></p><p><b> 界面截圖</b></p><p><b> 客戶端模塊</b><
41、/p><p><b> 連接服務(wù)器(登陸)</b></p><p> 分析:點(diǎn)擊連接按鈕,系統(tǒng)首先檢測服務(wù)器端服務(wù)器是否啟動,若沒有啟動,則顯示“連接服務(wù)器失敗”,若啟動,則進(jìn)行下一步操作,系統(tǒng)從客戶端讀取用戶輸入的端口號,服務(wù)器IP以及姓名,驗(yàn)證是否合格,若端口號,服務(wù)器IP以及姓名均合格,則顯示“成功連接”,用戶登陸成功;若有一項(xiàng)不合格,則顯示“與服務(wù)器連接失敗”
42、,用戶登陸失敗。</p><p><b> 流程圖</b></p><p><b> 關(guān)鍵代碼</b></p><p> // 單擊連接按鈕時事件</p><p> btn_start.addActionListener(new ActionListener() {</p>&
43、lt;p> public void actionPerformed(ActionEvent e) {</p><p><b> int port;</b></p><p> if (isConnected) {</p><p> JOptionPane.showMessageDialog(frame, "已處于連接上狀態(tài)
44、,不要重復(fù)連接!",</p><p> "錯誤", JOptionPane.ERROR_MESSAGE);</p><p><b> return;</b></p><p><b> }</b></p><p><b> try {</b>
45、</p><p><b> try {</b></p><p> port = Integer.parseInt(txt_port.getText().trim());</p><p> } catch (NumberFormatException e2) {</p><p> throw new Excepti
46、on("端口號不符合要求!端口為整數(shù)!");</p><p><b> }</b></p><p> String hostIp = txt_hostIp.getText().trim();</p><p> String name = txt_name.getText().trim();</p><
47、;p> if (name.equals("") || hostIp.equals("")) {</p><p> throw new Exception("姓名、服務(wù)器IP不能為空!");</p><p><b> }</b></p><p> boolean flag
48、= connectServer(port, hostIp, name);</p><p> if (flag == false) {</p><p> throw new Exception("與服務(wù)器連接失敗!");</p><p><b> }</b></p><p> frame.set
49、Title(name);</p><p> JOptionPane.showMessageDialog(frame, "成功連接!");</p><p> } catch (Exception exc) {</p><p> JOptionPane.showMessageDialog(frame, exc.getMessage(),<
50、/p><p> "錯誤", JOptionPane.ERROR_MESSAGE);</p><p><b> }</b></p><p><b> }</b></p><p><b> });</b></p><p> publ
51、ic boolean connectServer(int port, String hostIp, String name) {</p><p><b> // 連接服務(wù)器</b></p><p><b> try {</b></p><p> socket = new Socket(hostIp, port);//
52、 根據(jù)端口號和服務(wù)器ip建立連接</p><p> writer = new PrintWriter(socket.getOutputStream());</p><p> reader = new BufferedReader(new InputStreamReader(</p><p> socket.getInputStream()));</p&g
53、t;<p> // 發(fā)送客戶端用戶基本信息(用戶名和ip地址)</p><p> sendMessage(name + "@" + socket.getLocalAddress().toString());</p><p> // 開啟接收消息的線程</p><p> messageThread = new MessageT
54、hread(reader, textArea);</p><p> messageThread.start();</p><p> isConnected = true;// 已經(jīng)連接上了</p><p> return true;</p><p> } catch (Exception e) {</p><p&g
55、t; textArea.append("與端口號為:" + port + " IP地址為:" + hostIp</p><p> + " 的服務(wù)器連接失敗!" + "\r\n");</p><p> isConnected = false;// 未連接上</p><p>
56、 return false;</p><p><b> }</b></p><p><b> }</b></p><p> // 客戶端線程的構(gòu)造方法 </p><p> public ClientThread(Socket socket) { </p><p>
57、;<b> try { </b></p><p> this.socket = socket; </p><p> reader = new BufferedReader(new InputStreamReader(socket </p><p> .getInputStream())); </p><p&g
58、t; writer = new PrintWriter(socket.getOutputStream()); </p><p> // 接收客戶端的基本用戶信息 </p><p> String inf = reader.readLine(); </p><p> StringTokenizer st = new StringTokenizer(inf
59、, "@"); </p><p> user = new User(st.nextToken(), st.nextToken()); </p><p> // 反饋連接成功信息 </p><p> writer.println(user.getName() + user.getIp() + "與服務(wù)器連接成功!")
60、; </p><p> writer.flush(); </p><p> // 反饋當(dāng)前在線用戶信息 </p><p> if (clients.size() > 0) { </p><p> String temp = ""; </p><p> for (int i
61、= clients.size() - 1; i >= 0; i--) { </p><p> temp += (clients.get(i).getUser().getName() + "/" + clients </p><p> .get(i).getUser().getIp()) </p><p><b> +
62、"@"; </b></p><p><b> } </b></p><p> writer.println("USERLIST@" + clients.size() + "@" + temp); </p><p> writer.flush(); </p
63、><p><b> } </b></p><p> // 向所有在線用戶發(fā)送該用戶上線命令 </p><p> for (int i = clients.size() - 1; i >= 0; i--) { </p><p> clients.get(i).getWriter().println( &l
64、t;/p><p> "ADD@" + user.getName() + user.getIp()); </p><p> clients.get(i).getWriter().flush(); </p><p><b> } </b></p><p> } catch (IOExceptio
65、n e) { </p><p> e.printStackTrace(); </p><p><b> } </b></p><p><b> } </b></p><p><b> ?。?)結(jié)果截圖</b></p><p> 服務(wù)器未啟
66、動,客戶端連接失敗</p><p><b> 端口號不符合要求</b></p><p> 服務(wù)器IP地址不符合</p><p><b> 符合要求,連接成功</b></p><p><b> 發(fā)送消息</b></p><p> 分析:點(diǎn)擊發(fā)送按
67、鈕,系統(tǒng)首先檢查用戶連接狀態(tài),若沒有連接,則顯示“還沒有連接服務(wù)器,無法發(fā)送消息”,若連接成功,則進(jìn)一步檢驗(yàn)寫消息文本框中是否有內(nèi)容,若為空,則顯示“消息不能為空”,若有內(nèi)容,則成功發(fā)送消息。</p><p><b> 流程圖</b></p><p><b> 關(guān)鍵代碼</b></p><p> // 寫消息的文本框
68、中按回車鍵時事件</p><p> textField.addActionListener(new ActionListener() {</p><p> public void actionPerformed(ActionEvent arg0) {</p><p><b> send();</b></p><p>
69、;<b> }</b></p><p><b> });</b></p><p> // 單擊發(fā)送按鈕時事件</p><p> btn_send.addActionListener(new ActionListener() {</p><p> public void actionPerf
70、ormed(ActionEvent e) {</p><p><b> send();</b></p><p><b> }</b></p><p><b> });</b></p><p><b> // 執(zhí)行發(fā)送</b></p>
71、<p> public void send() {</p><p> if (!isConnected) {</p><p> JOptionPane.showMessageDialog(frame, "還沒有連接服務(wù)器,無法發(fā)送消息!", "錯誤",</p><p> JOptionPane.ERROR_M
72、ESSAGE);</p><p><b> return;</b></p><p><b> }</b></p><p> String message = textField.getText().trim();</p><p> if (message == null || message
73、.equals("")) {</p><p> JOptionPane.showMessageDialog(frame, "消息不能為空!", "錯誤",</p><p> JOptionPane.ERROR_MESSAGE);</p><p><b> return;</b>&
74、lt;/p><p><b> }</b></p><p> sendMessage(frame.getTitle() + "@" + "ALL" + "@" + message);</p><p> textField.setText(null);</p><p&
75、gt;<b> }</b></p><p><b> 結(jié)果截圖</b></p><p> 沒有連接服務(wù)器,不能發(fā)送消息</p><p><b> 發(fā)送消息不能為空</b></p><p><b> 成功發(fā)送消息</b></p>&l
76、t;p><b> 斷開服務(wù)器</b></p><p> 分析:點(diǎn)擊斷開按鈕,系統(tǒng)檢測用戶是否是連接狀態(tài),若是,則顯示“成功斷開”,若用戶已處于斷開狀態(tài),則顯示“已處于斷開狀態(tài),不能重復(fù)斷開”。</p><p><b> 流程圖</b></p><p><b> 關(guān)鍵代碼</b></
77、p><p> // 單擊斷開按鈕時事件</p><p> btn_stop.addActionListener(new ActionListener() {</p><p> public void actionPerformed(ActionEvent e) {</p><p> if (!isConnected) {</p>
78、;<p> JOptionPane.showMessageDialog(frame, "已處于斷開狀態(tài),不要重復(fù)斷開!",</p><p> "錯誤", JOptionPane.ERROR_MESSAGE);</p><p><b> return;</b></p><p><b
79、> }</b></p><p><b> try {</b></p><p> boolean flag = closeConnection();// 斷開連接</p><p> if (flag == false) {</p><p> throw new Exception("斷
80、開連接發(fā)生異常!");</p><p><b> }</b></p><p> JOptionPane.showMessageDialog(frame, "成功斷開!");</p><p> } catch (Exception exc) {</p><p> JOptionPane
81、.showMessageDialog(frame, exc.getMessage(),</p><p> "錯誤", JOptionPane.ERROR_MESSAGE);</p><p><b> }</b></p><p><b> }</b></p><p><
82、b> });</b></p><p> public synchronized boolean closeConnection() {</p><p><b> try {</b></p><p> sendMessage("CLOSE");// 發(fā)送斷開連接命令給服務(wù)器</p>&l
83、t;p> messageThread.stop();// 停止接受消息線程</p><p><b> // 釋放資源</b></p><p> if (reader != null) {</p><p> reader.close();</p><p><b> }</b></
84、p><p> if (writer != null) {</p><p> writer.close();</p><p><b> }</b></p><p> if (socket != null) {</p><p> socket.close();</p><p&
85、gt;<b> }</b></p><p> isConnected = false;</p><p> return true;</p><p> } catch (IOException e1) {</p><p> e1.printStackTrace();</p><p> i
86、sConnected = true;</p><p> return false;</p><p><b> }</b></p><p><b> }</b></p><p><b> 結(jié)果截圖</b></p><p><b> 成功
87、斷開</b></p><p> 已處于斷開狀態(tài),不能下重復(fù)斷開</p><p><b> 服務(wù)器端模塊</b></p><p><b> 啟動服務(wù)器</b></p><p> 分析:點(diǎn)擊啟動按鈕,系統(tǒng)檢驗(yàn)端口號以及人數(shù)上限是否正確,若正確,則顯示“服務(wù)器成功啟動”,啟動成功;若不
88、正確,則顯示相應(yīng)的錯誤信息,啟動失敗。</p><p><b> 流程圖</b></p><p><b> 關(guān)鍵代碼</b></p><p> // 單擊啟動服務(wù)器按鈕時事件 </p><p> btn_start.addActionListener(new ActionListener(
89、) { </p><p> public void actionPerformed(ActionEvent e) { </p><p> if (isStart) { </p><p> JOptionPane.showMessageDialog(frame, "服務(wù)器已處于啟動狀態(tài),不要重復(fù)啟動!", </p>&l
90、t;p> "錯誤", JOptionPane.ERROR_MESSAGE); </p><p><b> return; </b></p><p><b> } </b></p><p> int max; </p><p> int port; <
91、;/p><p><b> try { </b></p><p><b> try { </b></p><p> max = Integer.parseInt(txt_max.getText()); </p><p> } catch (Exception e1) { </p>
92、;<p> throw new Exception("人數(shù)上限為正整數(shù)!"); </p><p><b> } </b></p><p> if (max <= 0) { </p><p> throw new Exception("人數(shù)上限為正整數(shù)!"); </
93、p><p><b> } </b></p><p><b> try { </b></p><p> port = Integer.parseInt(txt_port.getText()); </p><p> } catch (Exception e1) { </p>&
94、lt;p> throw new Exception("端口號為正整數(shù)!"); </p><p><b> } </b></p><p> if (port <= 0) { </p><p> throw new Exception("端口號 為正整數(shù)!"); </p>
95、;<p><b> } </b></p><p> serverStart(max, port); </p><p> contentArea.append("服務(wù)器已成功啟動!人數(shù)上限:" + max + ",端口:" + port </p><p> + "\r\
96、n"); </p><p> JOptionPane.showMessageDialog(frame, "服務(wù)器成功啟動!"); </p><p> btn_start.setEnabled(false); </p><p> txt_max.setEnabled(false); </p><p>
97、 txt_port.setEnabled(false); </p><p> btn_stop.setEnabled(true); </p><p> } catch (Exception exc) { </p><p> JOptionPane.showMessageDialog(frame, exc.getMessage(), </p>
98、;<p> "錯誤", JOptionPane.ERROR_MESSAGE); </p><p><b> } </b></p><p><b> } </b></p><p><b> }); </b></p><p> //
99、 啟動服務(wù)器 </p><p> public void serverStart(int max, int port) throws java.net.BindException { </p><p><b> try { </b></p><p> clients = new ArrayList<ClientThread&g
100、t;(); </p><p> serverSocket = new ServerSocket(port); </p><p> serverThread = new ServerThread(serverSocket, max); </p><p> serverThread.start(); </p><p> isSta
101、rt = true; </p><p> } catch (BindException e) { </p><p> isStart = false; </p><p> throw new BindException("端口號已被占用,請換一個!"); </p><p> } catch (Excepti
102、on e1) { </p><p> e1.printStackTrace(); </p><p> isStart = false; </p><p> throw new BindException("啟動服務(wù)器異常!"); </p><p><b> } </b></p&
103、gt;<p><b> } </b></p><p><b> 結(jié)果截圖</b></p><p> 端口號不正確,啟動失敗</p><p><b> 成功啟動 </b></p><p><b> 發(fā)送消息</b></p&
104、gt;<p> 分析:在服務(wù)器端點(diǎn)擊發(fā)送按鈕,系統(tǒng)先檢驗(yàn)服務(wù)器是否啟動,若沒有,則顯示“服務(wù)器還未啟動,不能發(fā)送消息”,若啟動成功,則進(jìn)一步檢驗(yàn)是否有用戶在線,若沒有用戶在線,則顯示“沒有用戶在線,不能發(fā)送消息”,若有用戶在線,則進(jìn)一步檢驗(yàn)消息文本框中的內(nèi)容是否為空,若為空,則顯示“消息不能為空”,若有內(nèi)容,則成功發(fā)送。</p><p><b> 流程圖</b></p
105、><p><b> 關(guān)鍵代碼</b></p><p> // 執(zhí)行消息發(fā)送 </p><p> public void send() { </p><p> if (!isStart) { </p><p> JOptionPane.showMessageDialog(frame, &
106、quot;服務(wù)器還未啟動,不能發(fā)送消息!", "錯誤", </p><p> JOptionPane.ERROR_MESSAGE); </p><p><b> return; </b></p><p><b> } </b></p><p> if (
107、clients.size() == 0) { </p><p> JOptionPane.showMessageDialog(frame, "沒有用戶在線,不能發(fā)送消息!", "錯誤", </p><p> JOptionPane.ERROR_MESSAGE); </p><p><b> return;
108、 </b></p><p><b> } </b></p><p> String message = txt_message.getText().trim(); </p><p> if (message == null || message.equals("")) { </p>&
109、lt;p> JOptionPane.showMessageDialog(frame, "消息不能為空!", "錯誤", </p><p> JOptionPane.ERROR_MESSAGE); </p><p><b> return; </b></p><p><b>
110、} </b></p><p> sendServerMessage(message);// 群發(fā)服務(wù)器消息 </p><p> contentArea.append("服務(wù)器說:" + txt_message.getText() + "\r\n"); </p><p> txt_message.setT
111、ext(null); </p><p><b> } </b></p><p> // 文本框按回車鍵時事件 </p><p> txt_message.addActionListener(new ActionListener() { </p><p> public void actionPerforme
112、d(ActionEvent e) { </p><p><b> send(); </b></p><p><b> } </b></p><p><b> }); </b></p><p> // 單擊發(fā)送按鈕時事件 </p><p>
113、; btn_send.addActionListener(new ActionListener() { </p><p> public void actionPerformed(ActionEvent arg0) { </p><p><b> send(); </b></p><p><b> } </b&g
114、t;</p><p><b> }); </b></p><p><b> 結(jié)果截圖</b></p><p> 服務(wù)器未啟動,不能發(fā)送消息</p><p> 沒有用戶在線,不能發(fā)送消息</p><p><b> 消息為空,不能發(fā)送</b>&l
115、t;/p><p><b> 成功發(fā)送消息</b></p><p><b> 停止服務(wù)器</b></p><p> 分析:點(diǎn)擊停止按鈕,系統(tǒng)停止服務(wù)器。</p><p><b> 關(guān)鍵代碼</b></p><p> // 關(guān)閉服務(wù)器 </p&
116、gt;<p> @SuppressWarnings("deprecation") </p><p> public void closeServer() { </p><p><b> try { </b></p><p> if (serverThread != null) </p>
117、;<p> serverThread.stop();// 停止服務(wù)器線程 </p><p> for (int i = clients.size() - 1; i >= 0; i--) { </p><p> // 給所有在線用戶發(fā)送關(guān)閉命令 </p><p> clients.get(i).getWriter().println(
118、"CLOSE"); </p><p> clients.get(i).getWriter().flush(); </p><p><b> // 釋放資源 </b></p><p> clients.get(i).stop();// 停止此條為客戶端服務(wù)的線程 </p><p> cl
119、ients.get(i).reader.close(); </p><p> clients.get(i).writer.close(); </p><p> clients.get(i).socket.close(); </p><p> clients.remove(i); </p><p><b> } &l
120、t;/b></p><p> if (serverSocket != null) { </p><p> serverSocket.close();// 關(guān)閉服務(wù)器端連接 </p><p><b> } </b></p><p> listModel.removeAllElements();// 清空
121、用戶列表 </p><p> isStart = false; </p><p> } catch (IOException e) { </p><p> e.printStackTrace(); </p><p> isStart = true; </p><p><b> } <
122、;/b></p><p><b> }</b></p><p><b> 結(jié)果截圖</b></p><p><b> 實(shí)驗(yàn)小結(jié)</b></p><p> 通過本次實(shí)驗(yàn),我了解了客戶端和服務(wù)器端的連接過程,了解了TCP協(xié)議是如何工作的,了解了服務(wù)器和客戶是怎么實(shí)現(xiàn)數(shù)
123、據(jù)通信的,服務(wù)器是如何把信息反饋給客戶的,懂得了理論與實(shí)際想結(jié)合的重要性,只掌握理論知識是遠(yuǎn)遠(yuǎn)不夠的,必須把理論知識應(yīng)用到實(shí)際生活中,在設(shè)計(jì)的過程中,我遇到了重重的困難,但我總是虛心的向別人請教別人也總是很能耐心的給我講解,我認(rèn)識到人與人之間要互相幫助,要多給別人分享自己的心得,要與同學(xué)們多多的探討,這樣,才能更好地解決問題,才能咋有限的時間里,做出更好地成果,通過本次實(shí)驗(yàn),我不僅對網(wǎng)絡(luò)有了一個更深層次的了解,更是加深了我與同學(xué)之間的友
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)--聊天室
- tcp課程設(shè)計(jì)--網(wǎng)絡(luò)聊天室
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)---tcp 協(xié)議優(yōu)化方法研究
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)-編程實(shí)現(xiàn)簡單的tcp協(xié)議分析器
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)---網(wǎng)絡(luò)聊天室
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)---基于tcp的點(diǎn)到點(diǎn)聊天程序設(shè)計(jì)
- 基于java的簡易網(wǎng)絡(luò)聊天程序-計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)-- 用winsock實(shí)現(xiàn)聊天室的vc++程序設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)-- 用winsock實(shí)現(xiàn)聊天室的vc++程序設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)tcp數(shù)據(jù)包
- 網(wǎng)絡(luò)編程課程設(shè)計(jì)-java聊天室
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 《計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)》
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)---網(wǎng)絡(luò)設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
評論
0/150
提交評論