基于Winsock的简单聊天工具的方案设计书.docx
《基于Winsock的简单聊天工具的方案设计书.docx》由会员分享,可在线阅读,更多相关《基于Winsock的简单聊天工具的方案设计书.docx(17页珍藏版)》请在冰豆网上搜索。
基于Winsock的简单聊天工具的方案设计书
课程设计(论文)任务书
信息学院专业计算机班级2009-2
一、课程设计(论文)题目基于Winsock的简单聊天工具的设计
二、课程设计(论文)工作:
自2011年6月20日起至2011年6月25日止。
三、课程设计(论文)的内容要求:
1)基本要求:
1、分析Winsock的编程技术,特别是Winsock使用
2、分析聊天程序的功能及其相关网络协议
3、给出程序流程图和设计方案
4、选择开发环境,编译源程序
5、给出软件测试文档
2)设计要求
1、资料提交形式:
课程设计报告一份(按学校相关标准、纸质,且严格按照给定模板来组织撰写,特别是课设时间要对、签名要手写、封面一定要用学校买的)、电子文档一份;
2、课程设计报告不少于3000字;
3、电子文档中必须至少有5份参考资料,压缩后以班为单位交电子版给老师,时间为第18周的周六。
4、成绩:
出勤占10%、课程设计报告占40%、答辩占20%、参考资料占30%。
5、课程设计报告模板写附录。
3)工具要求:
1、界面清楚易懂;
2、程序层次结构清晰。
4)实验安排:
1、地点:
创新大楼东405
2、时间:
周一、三、四上午8:
00--11:
30
学生签名:
2011年6月26日
课程设计(论文)评阅意见
项目
等 级
优秀
良好
中等
及格
不及格
课程设计态度评价
出勤情况评价
任务难度评价
工作量饱满评价
设计中创新性评价
论文书写规范化评价
综合应用能力评价
综合评定等级
评阅人谢昕职称教授
2011年6月27日
目 录
一、任务分析与方案设计1
1.任务分析1
2.方案设计1
二、开发环境与工具1
1.设计环境1
1.1eclipse开发平台介绍2
2.基础知识2
2.1javaSocket网络编程简介2
2.2套接字的介绍2
2.3TCP/IP协议简介3
三、关键技术与理论3
1.JAVA编程技术3
2.JavaSocket网络编程接口3
四、相关图解及程序4
1.体系结构设计4
2.具体功能模块的分析5
3.程序代码:
5
五、测试及结果分析10
六、心得体会12
七、参考文献12
一、任务分析与方案设计
1.任务分析
随着计算机科学技术的发展,网络越来越深刻地改变着人们生活方方面面。
各种基于网络的应用技术在人们的政治、经济、生活等各个方面都发挥着重要的作用。
例如QQ、MSN都是基于Internet的即时聊天工具。
它们比传统媒介具有数据量大、实时性强、操作简单成本低廉等优点。
因而它们在现实生活中受到了广泛的欢迎。
然而基于局域网的即时聊天工具却不如人意。
为了适应现代信息化,教学局域网应运而生,而教学局域网内的即时通信则显得尤为重要。
基于局域网的即时通信软件的核心技术其实与基于Internet的即时通信软件的设计技术是一样的,只是规模比较小。
基于Internet的通信工具一般采用TCP或者UDP协议来实现的,开发技术已经非常成熟,它们不仅实现了即时聊天、文件传输等功能,而且还能够实现即时视频、语音聊天功能等。
在局域网内,这类软件的设计比在Internet中设计更为简单。
因为Internet是网络中的网络,结构更为复杂,遇到的情况要比在局域网中还要多。
所以说局域网的聊天工具的设计要相对简单些。
而且即时通信是一个终端连往一个即时通信网络的服务。
即时通信不同于e-mail在于它的交谈是实时的。
大部分的即时通信服务提供了presenceawareness的特性--显示联络人名单,联络人是否在线与能否和联络人交谈。
2.方案设计
程序采用JAVA编程,利用java强大的基础类库,调用java中界面开发的swing和网络编程的net函数群来完成本次的javasocket(网络套接字)网络即时通信工具的开发。
在java中,可以把发送的信息看成是一个一个的对象,当我们利用socket链接把客户端和服务器链接起来以后,他们之间就可以以对象流的形式发送彼此需要通信的信息了。
在java的网络编程中,最为核心的就是客户端和服务器相互取得socket的链接,只要能够能够取得链接,其他的工作基本上都是java的面向对象的编程思想去完成一些网络通讯的业务逻辑的处理。
二、开发环境与工具
1.设计环境
开发程序的操作系统:
Windows7(在WindowsXP、2000里也可以)
编译工具:
eclipse
程序工程:
JAVA工程,Server和Client
网络环境:
局域网(或互联网上运用,只要安装客户端并且知道服务器端的IP)
1.1eclipse开发平台介绍
Eclipse是著名的跨平台的自由集成开发环境(IDE)。
主要用来Java语言开发。
Eclipse的本身只是一个框架平台,但是众多插件的支持,使得Eclipse拥有较佳的灵活性。
许多软件开发商都以Eclipse为框架开发自己的IDE。
另外由于eclipse是开源的,所以得到了广大用户的认可。
Eclipse也于2001年11月被它的开发公司IBM公司贡献给开源社区,现在它由非营利软件供应商联盟Eclipse基金会(EclipseFoundation)管理。
2.基础知识
2.1javaSocket网络编程简介
Socket有两种主要的操作方式:
面向连接的和无连接的。
面向连接的sockets操作就像一部电话,他们必须建立一个连接和一人呼叫。
所有的事情在到达时的顺序与它们出发时的顺序时一样。
无连接的sockets操作就像是一个邮件投递,没有什么保证,多个邮件可能在到达时的顺序与出发时的顺序不一样。
到底用哪种模式是邮应用程序的需要决定的。
如果可靠性更重要的话,用面向连接的操作会好一些.比如文件服务器需要他们的数据的正确性和有序性。
如果一些数据丢失了,系统的有效性将会失去。
一些服务器,比如间歇性地发送一些数据块,如果数据丢了的话,服务器并不想要再重新发过一次,因为当数据到达的时候,它可能已经过时了.确保数据的有序性和正确性需要额外的操作的内存消耗,额外的费用将会降低系统的回应速率。
无连接的操作使用数据报协议。
一个数据报是一个独立的单元,它包含了所有的这次投递的信息。
把它想象成一个信封吧,它有目的地址和要发送的内容。
这个模式下的socket不需要连接一个目的的socket,它只是简单地投出数据报。
无连接的操作是快速的和高效的,但是数据安全性不佳。
面向连接的操作使用TCP协议。
一个这个模式下的socket必须在发送数据之前与目的地的socket取得一个连接。
一旦连接建立了,sockets就可以使用一个流接口:
打开(-读-写-关闭)。
所有的发送的信息都会在另一端以同样的顺序被接收.面向连接的操作比无连接的操作效率更低,但是数据的安全性更高。
Java降低了建立一个sockets程序的难度。
每一个传输模式都被封装到了不同的类中。
面向连接的类将会首先被我们讨论。
到底用哪种模式是邮应用程序的需要决定的。
如果可靠性更重要的话,用面向连接的操作会好一些。
比如文件服务器需要他们的数据的正确性和有序性。
如果一些数据丢失了,系统的有效性将会失去。
一些服务器,比如间歇性地发送一些数据块,如果数据丢了的话,服务器并不想要再重新发过一次。
因为当数据到达的时候,它可能已经过时了。
确保数据的有序性和正确性需要额外的操作的内存消耗,额外的费用将会降低系统的回应速率.
2.2套接字的介绍
多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。
为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。
套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端面点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程非常非常简单的举例说明下:
Socket=Ipaddress+TCP/UDPport.应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。
2.3TCP/IP协议简介
TCP/IP协议实际上就是在物理网上的一组完整的网络协议。
其中TCP是提供传输层服务,而IP则是提供网络层服务。
TCP/IP主要包括以下协议:
IP:
网间协议(InternetProtocol),负责主机间数据的路由和网络上数据的存储。
同时为ICMP,TCP,UDP提供分组发送服务。
用户进程通常不需要涉及这一层。
ICMP:
网间报文控制协议(InternetControlMessageProtocol)此协议处理网关和主机的差错和传送控制。
TCP:
传输控制协议(TransmissionControlProtocol)这是一种提供给用户进程的可靠的全双工字节流面向连接的协议。
它要为用户进程提供虚电路服务,并为数据可靠传输建立检查。
三、关键技术与理论
1.JAVA编程技术
Java是Sun公司推出的一种编程语言。
它是一种通过解释方式来执行的语言,语法规则和C++类似。
同时,Java也是一种跨平台的程序设计语言。
用Java语言编写的程序叫做“Applet”(小应用程序),用编译器将它编译成类文件后,将它存在WWW页面中,并在HTML档上作好相应标记,用户端只要装上Java的客户软件就可以在网上直接运行“Applet”。
Java非常适合于企业网络和Internet环境,现在已成为Internet中最受欢迎、最有影响的编程语言之一。
Java有许多值得称道的优点,如简单、面向对象、分布式、解释性、可靠、安全、结构
2.JavaSocket网络编程接口
事实上网络编程,简单的理解就是两台计算机相互通讯数据而已。
对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了。
Javasdk提供一些相对简单的api来完成这些工作,socket就是其中之一。
对于java而言,这些api存在于这个包里面。
因此,只要导入这个包就可以准备网络编程了。
网络编程的基本模型就是客户机到服务器模型。
简单的说,就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置,并去建立两者之间的联系。
然后完成数据的通讯就可以了。
这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端。
基于这个简单的模型,就可以进入网络编程.
对于java而言已经简化了socket的编程接口。
首先需要确定有关提供固定位置的服务方是如何建立的。
java提供了serversocket来对其进行支持。
事实上当创建该类的一个实力对象并提供一个端口资源,就建立了一个固定位置可以让其他计算机来访问。
serversocketserver=newserversocket(6789);
这里稍微要注意的是端口的分配必须是唯一的。
因为端口是为了唯一标识每台计算机唯一服务的。
另外端口号是从0~65535之间的,前1024个端口已经被tcp/ip作为保留端口,因此,分配的端口只能是1024个之后的。
有了固定位置,现在所需要的就是一根连接线了。
该连接线由客户方首先提出要求。
因此java同样提供了一个socket对象来对其进行支持。
只要客户方创建一个socket的实例对象进行支持就可以了。
socketclient=newsocket(inetaddress.getlocalhost(),5678);
客户机必须知道有关服务器的ip地址。
对于这一点,java也提供了一个相关的类inetaddress。
该对象的实例必须通过它的静态方法来提供。
它的静态方法主要提供了得到本机ip和通过名字或ip直接得到inetaddress的方法。
i/o操作总是和网络编程息息相关的。
因为底层的网络是继续数据的。
除非远程调用,处理问题的核心在执行上。
否则,数据的交互还是依赖于io操作的。
所以,你也必须导入java.io这个包。
java的io操作也不复杂。
它提供了针对于字节流和unicode的读者和写者,然后也提供了一个缓冲用于数据的读写。
bufferedreaderin=newbufferedreader(newinputstreamreader
(server.getinputstream()));
printwriterout=newprintwriter(server.getoutputstream());
上面两句就是建立缓冲并把原始的字节流转变为unicode可以操作。
而原始的字节流来源于socket的两个方法,getinputstream()和getoutputstream()方法,分别用来得到输入和输出。
四、相关图解及程序
1.体系结构设计
一般的通信工具,都采用客户端/服务器体系结构。
客户端/服务器的结构包含:
客户端和服务端。
客户端访问和处理服务器上的数据,服务器接收和处理客户端的数据请求。
这种模式的好处就是可以将一个系统分为两个独立的部分进行开发设计,便于软件开发。
而且也把一个软件的功能交给两个部分去完成,则更加有效的利用了系统资源。
本程序中也采用了简单的客户端/服务器模式。
由于本程序比较简单,仅演示客户端与服务端进行通信。
2.具体功能模块的分析
由于该系统采用C/S模式,所以对功能模块进行划分时,就需要分服务器和客户端两部分进行。
由于服务器的主要功能是等待接收并反馈客户端的信息,所以服务器需要信息输出模块和通信模块。
其中通信模块包含信息发送模块和信息接收模块。
而信息输出模块要做到当信息发生改变时及时更新。
客户端同样也需要通信模块和信息输出模块,同时要互相通信,就要具备输入输出。
具体模块划分见下图:
3.程序代码:
服务器端:
/**
*服务器端
*简单的聊天界面
*/
packageView;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
import.*;
importjava.io.*;
importjava.util.*;
publicclassMyServerextendsJFrameimplementsActionListener{
//定义需要的组件
JTextFieldjtf;
JLabeljl;
JTextAreajta;
JScrollPanejsp;
JButtonjb1,jb2;
JPaneljp1,jp2,jp3;
PrintWriterpw=null;
publicstaticvoidmain(String[]args){
MyServerms=newMyServer();
}
//构造函数
publicMyServer()
{
//初始化组件
jp2=newJPanel();
jl=newJLabel("消息记录");
jp2.add(jl);
jta=newJTextArea();
jsp=newJScrollPane(jta);
jtf=newJTextField(20);
jb1=newJButton("发送");
jb1.addActionListener(this);
jb2=newJButton("取消");
jb2.addActionListener(this);
jp3=newJPanel();
jp3.add(jtf);
jp3.add(jb1);
jp3.add(jb2);
this.add(jp2,"North");
this.add(jsp,"Center");
this.add(jp3,"South");
this.setSize(400,300);
this.setTitle("聊天服务器端");
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try{
//让服务器在8888端口监听
ServerSocketss=newServerSocket(8888);
//等待客户端的链接
Sockets=ss.accept();
JOptionPane.showMessageDialog(this,"有客户端连接");
//接受客户端发送来的消息
BufferedReaderbr=newBufferedReader(newInputStreamReader(s.getInputStream()));
//给客户端写数据的时候用
pw=newPrintWriter(s.getOutputStream(),true);
//循环的读取客户端发来的信息
while(true)
{
Stringinfo=br.readLine();
Stringtime1=Calendar.getInstance().getTime().toLocaleString();
jta.append("客户端对服务器说:
"+"\r\n"+info+"接收时间:
"+time1+"\r\n");
}
}catch(Exceptione){
e.printStackTrace();
}
}
@Override
publicvoidactionPerformed(ActionEventarg0){
if(arg0.getSource()==jb1)
{
//把写的信息发送给客户端
Stringinfo=jtf.getText();
Stringtime2=Calendar.getInstance().getTime().toLocaleString();
jta.append("服务器对客户端说:
"+"\r\n"+info+"发送时间:
"+time2+"\r\n");
jtf.setText("");
pw.println(info);
//清空输入框
}
elseif(arg0.getSource()==jb2)
{
jtf.setText("");
}
}
}
客户端:
/**
*客户端
*简易聊天界面
*/
packageClient;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
import.*;
importjava.util.Calendar;
importjava.io.*;
publicclassMyClientextendsJFrameimplementsActionListener{
//定义需要的组件
JLabeljl;
JTextFieldjtf;
JTextAreajta;
JScrollPanejsp;
JButtonjb1,jb2;
JPaneljp1,jp2;
PrintWriterpw=null;
publicstaticvoidmain(String[]args){
MyClientmc=newMyClient();
}
//构造函数
publicMyClient()
{
//初始化组件
jl=newJLabel("消息记录");
jp1=newJPanel();
jp1.add(jl);
jta=newJTextArea();
jsp=newJScrollPane(jta);
jtf=newJTextField(20);
jb1=newJButton("发送");
jb1.addActionListener(this);
jb2=newJButton("取消");
jb2.addActionListener(this);
jp2=newJPanel();
jp2.add(jtf);
jp2.add(jb1);
jp2.add(jb2);
this.add(jp1,"North");
this.add(jsp,"Center");
this.add(jp2,"South");
this.setSize(400,300);
this.setLocation(950,5);
this.setTitle("聊天客户端");
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.connect();
}
publicvoidconnect()
{
try{
//与服务器链接
Sockets=newSocket("127.0.0.1",8888);
JOptionPane.showMessageDialog(this,"和服务器端连接成功");
InputStreamReaderisr=newInputStreamReader(s.getInputStream());
BufferedReaderbr=newBufferedReader(isr);
pw=newPrintWriter(s.getOutputStream(),true);
while(true)
{
//不停的读接受的数据
Stringinfo=br.readLine();
Stringtime1=Calendar.getInstance().getTime().toLocaleString();
jta.append("服务器对客户端说:
"+"\r\n"+info+"接收时间:
"+time1+"\r\n");
}
}catch(Exceptione){
e.printStackTrace();
}
}
@Override
publicvoidactionPerformed(ActionEventarg0){
if(arg0.getSource()==jb1)
{
Stringinfo=jtf.getText();
//把客户端发送的信息显示到jfa
Stringtime2=Calendar.getInstance().getTime()