基于Socket的阿基米德螺线图形设计Java基础课程设计.docx
- 文档编号:15585063
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:15
- 大小:160.81KB
基于Socket的阿基米德螺线图形设计Java基础课程设计.docx
《基于Socket的阿基米德螺线图形设计Java基础课程设计.docx》由会员分享,可在线阅读,更多相关《基于Socket的阿基米德螺线图形设计Java基础课程设计.docx(15页珍藏版)》请在冰点文库上搜索。
基于Socket的阿基米德螺线图形设计Java基础课程设计
成绩
南京工程学院
课程设计说明书(论文)
题目基于Socket的控制绘制阿基米德螺线
课程名称JAVA基础
院(系、部、中心)计算机工程学院
专业网络工程
班级网络132
学号202130834
学生姓名薛康威
设计地点信息楼A406
指导教师叶核亚
设计起止时间:
2015年6月15日至2015年6月19日
基于Socket的控制绘制阿基米德螺线
一、课程设计目的和要求
JAVA基础课程设计是巩固所学理论知识、提高程序设计能力的重要实践环节。
课程设计的目的是,使学生能够综合应用Java基础知识和基本方法,编写实用有效的应用程序,体会软件设计的全过程,深入理解和进一步巩固所学知识,培养自学能力,培养独立分析问题和解决问题的作风和能力,提高软件设计能力,为今后进行系统软件和应用软件的开发研究打下坚实基础,培养刻苦钻研精神和严谨的治学作风。
本课程设计的要求是,设计具有图形用户界面的、能够响应事件、能够处理异常的Java应用程序,并包含线程、流、文件操作、网络通信等技术。
进行课题的需求分析、设计方案准备、编程、运行、调试、完善等软件设计的各环节,程序必须运行通过,对于各种输入数据,有明确的不同的输出结果。
程序运行有错误时,必须采取各种调试手段排除错误。
二、题意说明及分析
基于Socket的控制绘制阿基米德螺线,意思就是指有两个进程通过TCP建立连接,其中服务端负责发送数据指令,客户端接收这些数据指令后开始绘制阿基米德螺线,建立这样一个单项传输数据的连接。
加入文件操作,将服务端的这些数据保存进指定文件内,打开文件则可重新调用此前保存的数据,继续绘图。
本次程序有三个重要的操作。
首先是基于TCP连接的Socket通信,实现两个进程的互通,其次是传输数据时对输入输出流的操作,最后是保存和打开文件的实现(其中也涉及对流的操作)。
三、算法设计与分析
(1)首先得创建两个进程,分别以服务端ArchimedesServer和客户端ArchimedesClient创建,通过Socket连接。
具体实现:
1、服务端创建指定端口号的ServerSocket对象,调用accept()方法等待接收客户端的连接请求,等待期间当前进程阻塞。
2、客户端创建Socket对象,指定服务端主机的ip和端口,发送TCP连接请求。
3、服务端接收客户端连接请求,进程继续运行,建立TCP连接,accept()方法返回一个Socket对象,通过该对象和客户端Socket对象实现实时数据通信。
(2)由于是一对一单向通信,约定由服务端发送数据,客户端接收数据并运行。
具体实现是服务端获得Socket输出流,以数据字节输出流输出。
客户端获得Socket输入流,以数据字节输入流输入,读取数据流的值。
发送的数据有两个,圈数和颜色(double型和int型)。
(3)这里保存和读取的文件是阿基米德螺线的参数,分别是圈数(doublen)、颜色(intrgb)和颜色按钮数组的下标(intcl)(为了打开文件后重新调用颜色参数,从而选中该按钮)。
保存文件时,以文件字节输出流打开文件,数据字节输出流写入文件内。
反之,读取文件时,数据字节输入流读取文件内容,并写入圈数文本框内和选中所读取的颜色按钮,运行即可。
四、源程序
服务端程序:
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
import.*;
importjava.io.*;
publicclassArchimedesServerextendsJFrameimplementsActionListener{
privateDataOutputStreamdout;
privateJPaneljp1,jp2;
privateJRadioButtonbcolor[];
privateJButtonjb1,jb2,jb3,jb4;
privateJTextFieldtext_l,text_q,text_f;
privateintflag=1;
privatedoublen;
privateintrgb,cl;
privateStringfilename;
publicArchimedesServer(intport,Stringname)throwsIOException{
super("绘图控制端"+InetAddress.getLocalHost()+":
"+port);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
jp1=newJPanel();
jp2=newJPanel();
text_q=newJTextField(5);
text_l=newJTextField(15);
text_f=newJTextField("data.data",6);
jp1.add(newJLabel("圈数:
"));
jp1.add(text_q);
jp1.add(newJLabel("颜色:
"));
Stringcolorstr[]={"红","绿","蓝"};
ButtonGroupcolorgroup=newButtonGroup();
bcolor=newJRadioButton[colorstr.length];
for(inti=0;i bcolor[i]=newJRadioButton(colorstr[i]); colorgroup.add(bcolor[i]); jp1.add(bcolor[i]); bcolor[i].addActionListener(this); } jb1=newJButton("开始绘制"); jb1.addActionListener(this); jb2=newJButton("断开"); jb2.addActionListener(this); jb3=newJButton("保存数据"); jb3.addActionListener(this); jb4=newJButton("打开"); jb4.addActionListener(this); jp2.add(jb1); jp2.add(jb2); jp2.add(jb3); jp2.add(text_f); jp2.add(jb4); this.getContentPane().add(jp1,"Center"); this.getContentPane().add(text_l,"North"); this.getContentPane().add(jp2,"South"); this.setVisible(true); this.pack(); ServerSocketserver=newServerSocket(port);//创建指定端口的ServerSocket对象 Socketclient=server.accept();//等待连接请求 this.text_l.setText("连接"+client.getPort()); this.dout=newDataOutputStream(client.getOutputStream());//数据字节输出流 while(flag==1){ continue; } dout.close(); server.close(); } publicvoidwriteTo(Stringfilename){ try{ FileOutputStreamfout=newFileOutputStream(filename); DataOutputStreamdout2=newDataOutputStream(fout); this.n=Double.parseDouble(text_q.getText()); dout2.writeDouble(n);//圈数写入文件 dout2.writeInt(cl);//颜色按钮数组下标写入文件 dout2.writeInt(rgb);//颜色值写入文件 dout2.close(); fout.close(); }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(NumberFormatExceptionnfex){ JOptionPane.showMessageDialog(this,"无法转换成浮点数","提醒",JOptionPane.WARNING_MESSAGE); }catch(IOExceptione1){ e1.printStackTrace(); } } publicvoidreadFrom(Stringfilename){ try{ FileInputStreamfin=newFileInputStream(filename); DataInputStreamdin2=newDataInputStream(fin); this.text_q.setText(din2.readDouble()+"");//读取圈数 this.bcolor[din2.readInt()].setSelected(true);//读取颜色按钮数组下标 rgb=din2.readInt();//读取颜色值 din2.close(); fin.close(); }catch(FileNotFoundExceptione){ e.printStackTrace(); }catch(IOExceptione1){ e1.printStackTrace(); } } publicstaticvoidmain(String[]args)throwsIOException{ newArchimedesServer(3123,"eric"); } publicvoidactionPerformed(ActionEvente){ Colorc=null; if(e.getSource()==bcolor[0]){ c=newColor(255,0,0); rgb=c.getRGB(); cl=0; } if(e.getSource()==bcolor[1]){ c=newColor(0,255,0); rgb=c.getRGB(); cl=1; } if(e.getSource()==bcolor[2]){ c=newColor(0,0,255); rgb=c.getRGB(); cl=2; } if(e.getSource()==jb1){ try{ this.n=Double.parseDouble(text_q.getText()); if(n<0||n>20) thrownewException(""); dout.writeDouble(n);//写入圈数 dout.writeInt(rgb);//写入颜色值 } catch(NumberFormatExceptionnfex){ JOptionPane.showMessageDialog(this,"无法转换成浮点数","提醒",JOptionPane.WARNING_MESSAGE); }catch(Exceptionqwe){ JOptionPane.showMessageDialog(this,"圈数必须在0~20之间","提醒",JOptionPane.WARNING_MESSAGE); } } if(e.getSource()==jb2){ jb1.setEnabled(false);//断开连接 } if(e.getSource()==jb3){ this.filename=text_f.getText(); writeTo(this.filename);//保存到文件 } if(e.getSource()==jb4){ this.filename=text_f.getText(); readFrom(this.filename);//读取文件 } } } 客户端程序: importjava.awt.*; importjavax.swing.*; import.*; importjava.io.*; publicclassArchimedesClientextendsJFrame{ privateArchimedesCanvasarchimedes; privateDataInputStreamdin; privateJPaneljp1; privateJTextFieldtext_q,text_c; privatedoublen; privateintrgb; publicArchimedesClient(Stringname,Socketsocket)throwsIOException{ super("绘画室"+name+""+InetAddress.getLocalHost()); Dimensiondim=getToolkit().getScreenSize(); this.setBounds(dim.width/4,dim.height/4,dim.width/2,dim.height/2); this.setDefaultCloseOperation(EXIT_ON_CLOSE); text_q=newJTextField(5); text_c=newJTextField("由控制端决定! ",8); text_q.setEditable(false); text_c.setEditable(false); jp1=newJPanel(); jp1.add(newJLabel("圈数: ")); jp1.add(text_q); Stringlk[]={"",""}; for(inti=0;i jp1.add(newJLabel(lk[i])); } jp1.add(newJLabel("颜色: ")); jp1.add(text_c); this.getContentPane().add(jp1,"North"); archimedes=newArchimedesCanvas(Color.black,this.n); this.getContentPane().add(newJScrollPane(archimedes),"Center"); this.setVisible(true); this.setTitle(this.getTitle()+": "+socket.getLocalPort()); this.din=newDataInputStream(socket.getInputStream());//创建数据字节输入流 while(true){ try{ text_q.setText(din.readDouble()+"");//读取圈数输入流 rgb=din.readInt();//读取颜色值输入流 }catch(EOFExceptione){break;} this.n=Double.parseDouble(text_q.getText()); Colorc=newColor(rgb); archimedes.setn(n); archimedes.setColor(c); archimedes.repaint(); } din.close(); socket.close(); } publicArchimedesClient(Stringname,Stringhost,intport)throwsIOException{ this(name,newSocket(host,port));//发送连接请求 } publicstaticvoidmain(String[]args)throwsIOException{ newArchimedesClient("kudo","127.0.0.1",3123); } } classArchimedesCanvasextendsCanvas{ privateColorcolor; privatedoublex; publicArchimedesCanvas(Colorcolor,doublen){ this.setBackground(Color.WHITE); this.setColor(color); this.setn(n); } publicvoidsetColor(Colorcolor){ this.color=color; } publicvoidsetn(doublen){ this.x=n; } publicvoidpaint(Graphicsg){ intx0=this.getWidth()/2; inty0=this.getHeight()/2; g.setColor(color); g.drawLine(x0,0,x0,y0*2); g.drawLine(0,y0,x0*2,y0); for(inti=0;i<2048*this.x;i++){//n圈 doubleangle=i*Math.PI/1024;//分成2*1024点 doubleradius=0.05*angle; intx=(int)Math.round(radius*angle*Math.cos(angle)); inty=(int)Math.round(radius*angle*Math.sin(angle)); g.drawOval(x0+x,y0+y,1,1); } } } 五、结果及分析 实验结果如下: 服务端: 客户端: 保存的文件: 两处异常: 分析说明: (1)先运行服务端程序ArchimedesServer,再运行客户端程序ArchimedesClient。 当成功连接时,“绘图控制端”界面会出现“连接xxxx”。 (2)在圈数里输入一个理想值(0—20数字),选择一个颜色,点击“开始绘制”,则在客户端会接收到这两个值,并开始绘制规定的阿基米德螺线。 (3)点击“保存数据”,则会保存圈数、颜色值和单选按钮组下标到指定文件data.data。 点击打开,则会读取文件中先前保存的值到相应的位置,“开始绘制”后,图形会还原成先前保存的样子。 (4)这里的两个手动设置异常,由于文本框为输入值,圈数的定义无法是负数或者非数字类字符,所以需要在这里添加两个异常处理,数值格式转换异常和超出规定范围异常,如上图所示。 六、总结与思考 由于本课程设计的要求是,设计具有图形用户界面的、能够响应事件、能够处理异常的Java应用程序,并包含线程、流、文件操作、网络通信等技术。 我的程序是基于Socket的控制绘制阿基米德螺线,最后成功运行通过,对于各种输入数据,也有明确的不同的输出结果。 对于这种异常,也有相应的处理方式。 然而在文件操作时,做数据流的时候,也确实碰到了很多问题,比如把数据(圈数和颜色)写入文件再读取出来时,颜色读取的是其RGB值,无法赋值到单选按钮上,最后听取老师的建议,再写入一个颜色按钮数组的下标值,读取时,直接选中。 网络通信这一块,Socket开始也不怎么理解,是通过两个实例实践才有点感觉,才开始着手编写这个程序,Socket程序很简单,最重要的是懂原理。 我是选择一对一单项连接,这样编程比较容易。 其实本程序还可以添加一个线程,在画点与点之间添加睡眠时间,延缓画图过程。 只不过再在服务端传添加个文本框,传递一个睡眠时间参数到客户端。 总之,本次课程设计是在实验六的基础上添加流、文件操作、网络通信技术,让我对整本书的知识体系有了一个系统的了解,对Java有了更深的理解。 只是学习书本知识还是远远不够的,自己不会的东西还有太多,比如编程算法,对问题的解决想法。 学习需要自己长期的积累,在以后的学习、工作中都应该不断的学习,将课本的理论知识与生活中的实践知识相结合,不断提高自己文化知识和实践能力。 教师评语:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Socket 阿基米德 螺线 图形 设计 Java 基础 课程设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)