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

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論