计算机网络实训设计基于TCPIP协议程序设计报告计算机专业毕业论文设计.docx
《计算机网络实训设计基于TCPIP协议程序设计报告计算机专业毕业论文设计.docx》由会员分享,可在线阅读,更多相关《计算机网络实训设计基于TCPIP协议程序设计报告计算机专业毕业论文设计.docx(14页珍藏版)》请在冰豆网上搜索。
计算机网络实训设计基于TCPIP协议程序设计报告计算机专业毕业论文设计
《计算机网络》报告
题目:
基于TCP/IP的聊天系统
专业:
计算机科学与技术(软件工程方向)
姓名:
xxx
学号:
xxx
老师:
xxx
得分
评阅老师
2010年6月3日
4.2需求分析
5.3客户端部分
前言:
Java是一种面向对象的、多线程、交互式的与平台无关的编程语言,Java语言功能强大,具有丰富的网络编程类库,支持socket编程。
Java利用其面向对象的功能封装了socket实现中的许多细节,能高效率的开发基于客户机/服务器模式的复杂网络应用程序。
本聊天室是Java基于TCP/IP协议的套接字socket、serversocket数据通信技术,运用这技术设计并实现一个基于Java的客户机/服务器模式的网络聊天室。
探讨网络聊天室设计与实现的一般流程。
和在设计过程中所涉及到的问题及解决方法。
1.引言
1.1项目简要介绍:
一个基于TCP/IP可以实现不同用户之间的简单会话功能。
1.2项目背景:
学习完成计算机网络、TCP/IP协议与网络编程、Java语言等基础知识之后,为了学以致用和巩固学习的内容,为此这个小项目就此诞生。
1.3项目创新点:
在刚学习Java的情况下实现聊天室的用户界面
1.4定义:
基于TCP/IP的聊天系统
2.任务概述
2.1目标:
通过课程设计,熟悉Eclipse的编程环境。
了解TCP/IP协议,SOCKET各函数之间的联系。
通过对具体问题的分析、设计、验证,掌握软件开发的基本分析方法和设计方法,熟悉计算机网络的通信原理。
通过实际的课程实训来体验项目实现中遇到的种种问题和解决问题的方法,为以后就业打下相应基础。
2.2运行环境:
在WindowsXP系统、Eclipse开发平台。
3.需求规定
3.1功能需求:
能够实现不同用户之间的简单会话功能,设计需要一个输入用户名的文本框和一个用于发送聊天信息的文本框,在窗体的中央可以显示不同用户的聊天信息。
具体可分为:
聊天系统的功能需求进行分析,首先,聊天系统采用c/s架构,由服务器和客户端组成。
聊天系统服务器必须具有以下功能:
(1)启动服务器,建立侦听,接受客户端连接
(2)接收.分析.转发聊天信息
(3)向客户端发送系统信息
(4)关闭服务,并向客户端发送服务器关闭消息
3.2性能需求:
能够正确传输用户所要发送的信息,不出现乱码,或丢失等异常情况,满足用户聊天的简单需求。
4.总体设计
4.1基本设计概念和处理流程:
1)概念:
设计客户端/服务端的聊天程序,实现用户登陆聊天服务器,发送和及时接收聊天信息;实现服务器对聊天信息的监听。
2)需求分析:
采用c/s结构,考虑共有6个需求:
a.建立侦听服务
这个需求是服务器端的需求。
b.用户登录
包括客户端请求登录以及服务器端响应登录两个过程。
c.收发聊天信息
包括客户端发送聊天信息以及服务器端转发聊天信息两个过程。
d.收发系统信息
由服务器端发送给客户端的信息。
e.用户下线
包括客户端请求下线以及服务器响应请求两个过程,这个与用户登录类似。
f.服务器关需要完成的任务
3)利用Java实现一个简单的服务器需要5个步骤;
第一步,创建一个serversocket类的对象。
第二步,建立侦听。
建立侦听是由serversocket类的accept函数完成。
第三步,获取用于与远程客户端通信的outputstream对象和intputstream对象。
第四步,利用objectoutputstream类的writeobject函数,进行数据的准备,并利用objectoutput类的flush函数,将函数发送出去。
第五步,当传输结束后,调用socket的close方法,关闭连接。
4)利用Java实现一个简单的客户端需要4个步骤;
第一步,创建socket类对象,用做连接套接字。
第二步,绑定和连接的套接字。
用于数据的发送与接收。
第三步,获取用于与远程服务器通信的outputstream对象和intputstream对象。
第四步,当客户端完成通信,通过socket的close方法关闭连接。
5)模型与分析:
本系统设计是基于TCP的。
TCP是面向连接的可靠的传输协议,利用TCP协议进行通信,首先要经过三步握手,以建立通信双方的连接。
一旦连接建立好,就可以进行通信了。
TCP提供了数据的确认和数据的重传机制,保证了发送的数据一定能够到达通信的对方。
6)C/S模型流程
在C/S模型的网络中,服务器是网络的核心,客户机是网络的基础,客户机依靠服务器获得所需要的网络资源,而服务器为客户机提供网络所必须的资源。
客户端与服务器端流程图:
基于TCO/IP协议建议连接进行数据连接的流程图
4.2总体结构:
可分为3部分实现:
窗口、服务器端、客户端
5.代码设计分析
<1>.聊天室用户界面设计:
该界面主要分为3个部分。
窗体的上部可以用来输入用户界面,在聊天信息标签后可以输入相关聊天信息,还有一个发送消息的button按钮,单击它可以将在文本框中输入的信息发送到窗体中央,窗体中央用来显示不同用户的聊天信息。
publicclassClientextendsJFrameimplementsActionListener{
LabellblName=newLabel("用户名");//用户名标签
JTextFieldtxfName=newJTextField(10);//用户名输入文本框
JTextAreatxfMsgView=newJTextArea(20,60);//创建用于显示聊天信息文本域
JButtonbtSendMsg=newJButton("发送消息");//创建用于发送信息的按钮
JTextFieldtxfMsg=newJTextField(20);//创建用于输入聊天信息文本框
staticintport=6789;//端口号
Socketsocket=null;//连接端口
PrintStreamps=null;//打印输出流
MyThreadmyThread=null;//监听线程
/*构造方法*/
publicClient(){
super("欢迎进入聊天会话程序");//创建窗体标题
JPanelpanelName=newJPanel();//创建表示用户名的面板
panelName.add(lblName);//将用户名的标签信息放入到面板中
panelName.add(txfName);//将表示用户名的文本框信息放入到面板
JPanelpanelMsg=newJPanel();//创建用于输入聊天信息面板
panelMsg.add(newLabel("聊天信息"));//创建显示聊天信息的标题
panelMsg.add(txfMsg);//将输入信息文本框放入到面板中
panelMsg.add(btSendMsg);//将发送信息按钮放入到面板中
btSendMsg.addActionListener(this);//为发送信息按钮添监听方法
JPanelpanel=newJPanel();//创建存放用户名和聊天信息的面板
panel.setLayout(newGridLayout(2,1,3,3));//设置网格布局管理器
panel.add(panelName);//将表示用户名信息的面板放入到面板中
panel.add(panelMsg);//将表示聊天信息的面板放入到面板中
setLayout(newBorderLayout());//设置布局管理器
add(panel,BorderLayout.NORTH);//将输入聊天信息的面板放入到布局管理器上部
add(txfMsgView,BorderLayout.CENTER);//将显示聊天信息的面板放入到布局管理器中央
txfMsgView.setEditable(false);//将显示信息文本框设置为不可编辑
pack();//调整此窗口的大小
setBounds(400,200,500,300);//设置窗体位置大小
setVisible(true);//设置窗体是否显示
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体关闭的处理方式
}
在服务器端的构造方法中首先调用其父类的构造方法创建窗体标题,并将信息文本框设置为不可编辑,然后创建用于显示和输入聊天信息以及存放用户名和聊天信息的画面,并将表示用户名信息和聊天信息的文本框和标签放入到不同的面板中。
为存放用户名和聊天信息的画面设置网格布局管理器,将表示用户信息的面板和聊天信息的面板放入到该面板中。
设置布局管理器,将聊天信息多行文本框和显示聊天信息面板放入到布局管理器中。
最后设置窗口大小、是否显示以及关闭的处理方式。
<4>.服务器端设计
服务器端程序主要用来监听端口并处理来自不同用户的请求,因此在服务器端的代码中需要使用一个线程类来处理每一个用户发出的请求信息。
在服务器程序中首先定义一个与客户端连接的端口号,创建用来实现服务器套接字和客户端套接字的对象。
在服务器端的构造方法中,初始化服务器套接字,并使用accept()方法监听指定端口,不断接受来自客户端的套接字请求,同时实例化一个客户线程并使用statr()方法启动该线程。
接着创建一个用来处理用户发出的请求信息的线程类,在该类中运行一个线程,读取来自客户端的数据。
如果判断读取的数据流为空,则将方法返回。
如果读取的数据不为空,则截取客户端发送的聊天信息,如果接受的数据流是exit,则推出循环。
最后在main()方法中创建一个server对象。
部分实现代码如下。
:
1.定义端口号和创建套接字
privatestaticintport=6789;//端口号
privatestaticServerSocketserver=null;//创建用来实现服务器套接字对象
privatestaticSocketsocket=null;//创建用来实现客户端接字的对象
2.初始化服务套接字、接受来自客户端套接字请求.
try{
"服务器已经启动");
server=newServerSocket(port);//初始化服务器套接字
while(true){
socket=server.accept();//接受来自客户端套接字请求MyThreadmyThread=newMyThread(socket);//实例化一个客户线程myThread.start();//启动线程
}
}
3.创建一个用来处理用户发出请求的线程类
publicvoidrun(){
try{
InputStreamin=socket.getInputStream();
reader=newBufferedReader(newInputStreamReader(in));//获取输入流
PrintWriterout=newPrintWriter((socket.getOutputStream()),true);
4.判断读取的数据流
if(line==null){
return;//方法返回
}
if(line.substring(0,4).equals("LGN:
")){//截取发送来的是聊天信息
msg=newStringBuffer("");
msg.append(line);//读取数据流信息
msg.append("\n");//换行
out.println(msg);//发送聊天语句到各个客户端
}elseif(line.substring(0,4).equals("exit")){
break;
}
server.close();//关闭服务器
以上就是服务器端的一些代码实现过程
<5>.客户端设计
1.
相对于服务器端来说,客户端的设计相对比较复杂些。
当客户端启动后,需要向指定的服务器端发送连接请求,与服务器连接。
在用户界面中当输入用户名和聊天信息后,单机发送的Button按钮时,会触发一个事件并启动一个监听线程。
其触发事件简单如下叙述:
publicvoidactionPerformed(ActionEvente){
try{
if(e.getSource()==btSendMsg){//单击发送按钮
/*判断套接字的内容是否为空*/
if(socket!
=null){
StringBufferlgnStr=newStringBuffer("LGN:
");//创建一个可变字符串
lgnStr.append(txfName.getText());//获取用户名
StringBuffermsgStr=newStringBuffer("MSG:
");//创建一个可变字符串
msgStr.append(txfMsg.getText());//获取信息
StringBuffermsg=lgnStr.append(msgStr);//创建一个可变字符串
ps.println(msg);//发送信息
ps.flush();//顺序打印输出流
}
if(socket==null){
socket=newSocket("localhost",port);//创建一个套接字对象
ps=newPrintStream(socket.getOutputStream());//获取输出流
ps.flush();//刷新打印输出流
}
myThread=newMyThread(this,socket);//创建监听线程
myThread.start();//启动监听线程
}
}catch(Exceptionex){
"IOException"+ex.getMessage());//输出错误信息
ex.printStackTrace();//追踪异常事件发生时执行堆栈的内容
}
}
2.
为之前窗口设计时表示发送消息的Button按钮btSendMsg添加了一个addActionListener(this)监听方法。
当单击该按钮时,会触发这里的actionPerformed()方法。
在该方法中会判断套接字的内容是否为空,如果套接字的内容不为空,则会分别创建表示用户名和发送消息的可变字符串,将在聊天信息的文本框中输入的信息发送给服务器端,同时刷新打印输出流。
如果判断套接字的内容为空,则需要首先创建一个套接字对象,与服务器端进行连接,通过和服务器端建立连接与服务器端的程序进行通信。
然后创建一个用于监听的线程并启动线程。
在创建监听方法时,需要传入两个参数,一个是当前对象,另一个是客户端的套接字对象,因此在监听方法中需要有一个可以连接两个参数的构造方法。
其部分代码如下:
1.创建一个缓冲字符输入流对象、一个套接字对象、一个客户端对象、构造方法。
classMyThreadextendsThread{
BufferedReaderreader;//创建缓冲字符输入流对象
Socketsocket=null;//创建套接字对象
Clientclient=null;//创建客户端对象
/*构造方法*/
publicMyThread(Clientc,Sockets){
client=c;//客户端对象
socket=s;//套接字
}
2.线程运行方法
publicvoidrun(){
Stringmsg="";
try{
InputStreamin=socket.getInputStream();//获取输入流
reader=newBufferedReader(newInputStreamReader(in));//创建缓冲字符输入流对象
PrintWriterout=newPrintWriter((socket.getOutputStream()),true);
}catch(IOExceptione){
"IOException"+e.getMessage());//输出错误信息
e.printStackTrace();//追踪异常事件发生执行堆栈内容
}
3.判断服务器传来的信息是否为空
1).将套接字是否为空作为循环条件
while(socket!
=null){
try{
msg=reader.readLine();//读取服务器端传来的信息
intmsgInfoIndex=msg.indexOf("MSG:
");//截取字符串信息
/*判断从服务器传来的信息是否为空*/
if(msg.equals("")){
return;//方法返回
}
2).判断从服务器传来的信息是否为空
if(msg.equals("")){
return;//方法返回
3).判断用户名信息
if(msg.substring(0,4).equals("LGN:
")){
StringlgnInfo=msg.substring(4,msgInfoIndex);//读取服务器端传来信息
txfMsgView.append(lgnInfo);//显示聊天信息
txfMsgView.append(":
");
4).判断发送消息信息
if(msg.indexOf("MSG:
")!
=-1){
StringmsgInfo=msg.substring(msgInfoIndex+4);//读取服务器端传来信息
if(!
msgInfo.equals("exit")){
txfMsgView.append(msgInfo);//显示聊天信息
txfMsgView.append("\n");//换行
}else{
txfMsgView.append("端口关闭,退出聊天程序!
!
!
");//显示聊天信息
;//关闭端口
return;//方法返回
}
}
5).异常处理
catch(IOExceptione){
"IOException异常:
"+e.getMessage());//输出错误信息
e.printStackTrace();//追踪异常事件发生时执行堆栈的内容
在线程的运行过程中,需要读取服务器端传来的信息,判断从服务器端传来的信息是否为空,如果为空,就将方法返回。
如果服务器端传来的方法不为空,就判断是来自聊天信息文本框输入的信息还是来自用户名文本框输入信息。
在这里使用indexOf方法,首先获取从服务器端传来的字符串是否包含发送信息,并取得表示发送消息的标志“MSG:
”所在的字符串的位置。
如果从服务器端传来的字符串的前4个字符是“LGN:
”。
则获取用户名的信息。
如果从服务器端传来的字符串中含有“MSG:
”信息,则获取发送的信息,并对获取的聊天信息进行判断。
如果服务器传来的信息不是exit,就将截取后的服务器端传来的信息读取出来并显示在窗体中。
如果服务器端传来的信息是exit,就打印退出聊天程序的信息并退出方法。
程序的最后使用removeAll()方法将此次输入信息删除,准备接受下一次输入的聊天信息。
为了使程序能够顺利地运行,需要造客户端的代码中添加main()方法,该方法需要创建一个客户对象。
代码如下:
publicstaticvoidmain(String[]args){
newClient();//创建客户端对象
}
6.运行结果
服务器启动截图:
连接成功截图:
聊天画面截图:
7.使用说明
先启动服务器端的程序代码,在服务器端启动成功之后,再启动客户端,就可以进行聊天。
心得体会
时间犹如白驹过隙,转眼间大三就这样要结束了,这学期又学了几门计算机相关的课程,其中有计算机网络、TCP/IP协议与网络编程。
为了更好的掌握这些方面的知识,为此进行了为期两周的计算机网络的实训。
在实训的过程当中遇到了困难,也感到了学习的快乐。
当遇到困难时学会了怎么去面对困难,这样去寻找解决困难的方法。
其中网络是最重要的资源,对于计算机专业的人来说,有这样一句话:
Google加电驴,走偏天下不用怕。
的确,网络里面有着你想要的几乎所有资源,只要看你怎么去寻找。
还有就是多问,问同学、问老师、问你身边的人。
三人行,必有我师。
只有敢于发问,才能学得更多,学得得更好。
但不要一味的依赖网络和其他人,自己思考是重中之重,学会思考才能发现问题,才能更好的掌握知识点。
计算机网络的实训让我加大了对网络方面的更大理解与兴趣。
为了完成实训,首先就要掌握计算机网络的层次结构。
TCP/IP分层模型的四个协议层的功能、IP地址等。
此次网络实训任务是完成一个基于TCP/IP的聊天系统,其中包括服务器端和客户端两大部分。
由于这学期也刚开了Java的课程,所有就选用了Java来完成。
因为Java也不是很熟练,为此在完成的过程当遇到了更大的困难。
比如创建套接字的对象、接受处理、异常处理,还有各个函数的使用等,都是从零开始学习,边学习边应用。
其中函数的使用最为重要,该使用什么参数,怎么调用等。
还有就是在编写代码的过程当中一定要注意大小写的使用,因为往往这样简单是问题会带来实训完成的进度。
还有注意编写代码的风格,良好的编写风格会给检查错误等方面有很大的帮助。
作为程序员,要养成良好的编码习惯,不然以后就很难改过来了。
每一次这样的实训不要求一下子就能够完美的完成,但要感觉到自己学习的进步。
从中学到知识,这是最好的结果,因为自己每次的进步就是在给自己最后的成功做好铺垫。