互联网程序设计实验二
- 格式:doc
- 大小:270.50 KB
- 文档页数:5
实验报告(二)
课程名称:互联网程序设计年级:2017级实验日期:
姓名:学号:班级:
教师评语(成绩):
实验名称:实验二用SwingWorker
改写线程(2学时)
一、实验目的及要求
(1)理解并掌握服务器一客户一线程通用技术框架。
(2)理解并掌握SwingWorker<T,V>后台线程技术。
二、实验环境
多媒体计算机Windows7操作系统JDK 8 Netbeans IDE8.2(开发语言Java)
三、实验内容
(1)重温本章完成的Echo 一客户一线程服务器设计。
(2)学习和理解SwingWorker<T,V>这个类的用法。
四、实验步骤(或记录)及相关代码
(1)实验步骤:
重新修改页面设计:
修改部分代码:
原代码:
//发送
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();
//休眠10ms
try {
Thread.sleep(10);
} catch (InterruptedException ex) {
Logger.getLogger(ClientUI.class.getName()).log(Level.SEVERE, null, ex);
}
outStrNum--;
}
实验结果:
(2)用SwingWorker<TV>替代Thread 类定义ClientThread类
程序2.3(修改主要片段):
public class ServerUI extends javax.swing.JFrame {
private ServerSocket listenSocket=null; //侦听套接字
private 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=txtHostName.getText();//主机名
int hostPort=Integer.parseInt(txtHostPort.getText());//端口
//构建服务器的SocketAddress格式地址
SocketAddress serverAddr=new
InetSocketAddress(InetAddress.getByName(hostName),hostPort);
listenSocket=new ServerSocket(); //创建侦听套接字
listenSocket.bind(serverAddr); //绑定到工作地址
txtArea.append("服务器开始等待客户机连接...\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");
//创建客户线程clientThread,实现一客户一线程
SwingWorker<List<String>,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_btnStartActionPerformed
//关闭服务器之前
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 Thread {
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 void 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){ //只要客户机不关闭,则反复等待和接收客户机消息
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协议原封不动回送消息
SwingWorker<List<String>,String> worker=new
ClientThread(toClientSocket,clientCounts);
worker.execute();
out.println(toClientSocket.getLocalSocketAddress()+ " 客户机编号: "+clientCounts+" Echo消息:"+recvStr+" : "+time);。