《互联网程序设计实验二(5页).doc》由会员分享,可在线阅读,更多相关《互联网程序设计实验二(5页).doc(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-互联网程序设计实验二-第 5 页实验报告(二)课程名称:互联网程序设计年级:2017级实验日期: 姓名:学号:班级:实验名称:实验二 用SwingWorker改写线程(2学时)教师评语(成绩):一、实验目的及要求(1)理解并掌握服务器一客户一线程通用技术框架。 (2)理解并掌握 SwingWorker后台线程技术。二、实验环境多媒体计算机 Windows7操作系统 JDK 8 Netbeans IDE8.2(开发语言Java)三、 实验内容(1)重温本章完成的 Echo 一客户一线程服务器设计。 (2)学习和理解 SwingWorker这个类的用法。四、实验步骤(或记录)及相关代码(1)实验
2、步骤:重新修改页面设计:修改部分代码:原代码:/发送 out.println(outStr); txtInput.setText();修改后代码: /获取要发送的消息条数 String outStr_Num = txtInputNum.getText(); int outStrNum = Integer.parseInt(outStr_Num); /发送 while (outStrNum 0) new Thread() Override public void run() /发送 out.println(outStr); txtInput.setText(); .start(); /休眠10m
3、s try Thread.sleep(10); catch (InterruptedException ex) Logger.getLogger(ClientUI.class.getName().log(Level.SEVERE, null, ex); outStrNum-;实验结果:(2)用SwingWorker替代Thread 类定义ClientThread类程序2.3(修改主要片段):public class ServerUI extends javax.swing.JFrame private ServerSocket listenSocket=null; /侦听套接字 private
4、 Socket toClientSocket=null; /与客户机对话的套接字 public static int clientCounts=0; /客户数量编号 public ServerUI() initComponents(); /启动服务器 private void btnStartActionPerformed(java.awt.event.ActionEvent evt) /GEN-FIRST:event_btnStartActionPerformed try btnStart.setEnabled(false); /禁用按钮,避免重复启动 String hostName=txt
5、HostName.getText();/主机名 int hostPort=Integer.parseInt(txtHostPort.getText();/端口 /构建服务器的SocketAddress格式地址 SocketAddress serverAddr=new InetSocketAddress(InetAddress.getByName(hostName),hostPort); listenSocket=new ServerSocket(); /创建侦听套接字 listenSocket.bind(serverAddr); /绑定到工作地址 txtArea.append(服务器开始等待客
6、户机连接.n); catch (IOException ex) /创建一个匿名线程,用于侦听和接受客户机连接,并创建响应客户机的会话线程 new Thread(new Runnable() public void run() try while (true) /处理客户机连接 toClientSocket=listenSocket.accept();/侦听并接受客户机连接 clientCounts+;/客户机数量加1 txtArea.append(toClientSocket.getRemoteSocketAddress()+ 客户机编号: +clientCounts+ 会话开始.n); /创
7、建客户线程clientThread,实现一客户一线程 SwingWorkerList,String worker=new ClientThread(toClientSocket,clientCounts); worker.execute(); /end while catch (IOException ex) JOptionPane.showMessageDialog(null, ex.getMessage(), 错误提示, JOptionPane.ERROR_MESSAGE); /end run() ).start(); /GEN-LAST:event_btnStartActionPerfo
8、rmed /关闭服务器之前 private void formWindowClosing(java.awt.event.WindowEvent evt) /GEN-FIRST:event_formWindowClosing /关闭服务器之前释放套接字 if (listenSocket!=null) listenSocket=null; if (toClientSocket!=null) toClientSocket=null; /GEN-LAST:event_formWindowClosing程序2.4(修改主要片段):public class ClientThread extends Thr
9、ead private Socket toClientSocket=null;/会话套接字 private BufferedReader in; /网络输入流 private PrintWriter out; /网络输出流 private int clientCounts=0;/在线客户机总数 public ClientThread(Socket toClientSocket,int clientCounts) /构造函数 this.toClientSocket=toClientSocket; this.clientCounts=clientCounts; Override public vo
10、id run() try / 创建绑定到套接字toClientSocket上的网络输入流与输出流 in=new BufferedReader(new InputStreamReader(toClientSocket.getInputStream(),UTF-8); out=new PrintWriter(new OutputStreamWriter(toClientSocket.getOutputStream(),UTF-8),true); /5. 根据服务器协议,在网络流上进行读写操作 String recvStr; while (recvStr=in.readLine()!=null) /
11、只要客户机不关闭,则反复等待和接收客户机消息 Date date=new Date(); DateFormat format=new SimpleDateFormat(yyyy-mm-dd hh:mm:ss); String time=format.format(date); ServerUI.txtArea.append(toClientSocket.getRemoteSocketAddress()+ 客户机编号: +clientCounts+ 消息:+recvStr+ :+time+n); /解析并显示收到的消息 /按照echo协议原封不动回送消息 SwingWorkerList,Stri
12、ng worker=new ClientThread(toClientSocket,clientCounts); worker.execute(); out.println(toClientSocket.getLocalSocketAddress()+ 客户机编号: +clientCounts+ Echo消息:+recvStr+ : +time); /end while ServerUI.clientCounts-; /客户机总数减1 /远程客户机断开连接,线程释放资源 if (in!=null) in.close(); if (out!=null) out.close(); if (toClientSocket!=null) toClientSocket.close(); catch (IOException ex) /end run /end class五、总结本次实验巩固了一客户一线程的主要内容,对客户机和服务器之间的消息传递有了更深的理解。对SwingWorker类也有了初步的学习。但是还不是非常熟练,另外,对SwingWorker的使用通过上网查询,也有了初步的了解。