基于UDP的网络日期计算服务系统.docx
《基于UDP的网络日期计算服务系统.docx》由会员分享,可在线阅读,更多相关《基于UDP的网络日期计算服务系统.docx(17页珍藏版)》请在冰豆网上搜索。
![基于UDP的网络日期计算服务系统.docx](https://file1.bdocx.com/fileroot1/2023-2/3/0046f4eb-fa6c-4d15-a303-04c96f20a4c1/0046f4eb-fa6c-4d15-a303-04c96f20a4c11.gif)
基于UDP的网络日期计算服务系统
西安建筑科技大学华清学院
计算机网络课程设计报告
专业班级:
姓名:
学号:
指导教师:
2012年1月10日
目录
一、引言………………………………………………………3
二、基于TCP的程序设计…………………………………3
三、基于UDP的程序设计…………………………………
四、基于UDP的网络日期计算服务系统…………………9
五、心得体会…………………………………………………11
一、引言
本学期我们学习了计算机网络自顶向下方法这门课程,在这门课程中,我们将因特网分成应用层,运输层,网络层,链路层,物理层这五个层次进行一一学习。
其中运输层位于应用层和网络层之间,是分层的网络体系结构的重要部分。
该层为运行在不同主机上的应用进程提供直接的通信服务起着至关重要的作用。
运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信功能。
网络应用程序可以使用多种运输层协议。
例如:
因特网有两种协议,即TCP和UDP,这两种协议都能为其调用的应用程序提供一组不同的运输层服务。
计算机网络日期计算系统是基于UDP协议的,
二、基于TCP的程序设计
1.基本原理:
TCP是面向连接的可靠的传输层协议。
它支持在并不可靠的网络上实现面向链接的可靠的数据传输。
1.1特点:
(1)三次握手:
建立可靠连接。
(2)端口号:
多路复用。
(3)完整性校验:
差错检测。
(4)确认机制:
应答接受。
(5)序列号:
丢失检测,乱序重排。
(6)窗口机制:
流量控制,拥塞控制。
2.程序调试遇到的问题及解决
2.1错误调试:
由于服务器端可以不带选项进行启动,所以对服务器端的错误调试主要是带错误选项的调试;而客户端的错误调试包括不带选项启动、带不正确的端口号或者主机名启动,以及服务器为启动时启动客户端。
(1)服务器端选项错误:
①客户端不带选项:
客户端启动时必须带选项(服务器端IP地址或者主机名、端口号),如果不带选项启动则会出错并终止程序。
②服务器未启动时,启动客户端:
如果未启动服务器时就启动客户端,将不能正确连接到服务器端。
③客户端端口号或主机名不正确:
如果服务器端已经启动(服务器端IP地址为动态分配IP地址,端口号为“”),但是客户端启动时端口号、服务器IP地址或主机名有一个不正确将不能正确连接到服务器端。
(2)带正确选项的测试:
①以默认主机号名和端口号启动服务器:
假设服务器端IP地址为“192.168.1.101”,端口号为“2345”。
如果客户端有到服务器端的连接,则在客户端会显示连接信息,信息中包括客户端的IP地址。
由于这里是在同一台主机上,则这里将显示相应的客户端IP地址,但前提是服务器端不是以“192.168.1.101”为地址启动,而是相应的服务器端所在主机的IP地址或者主机名为地址来启动。
启动服务器端后,以正确的服务器端IP地址和端口号启动客户端,这时将在客户端显示连接信息,并显示来自服务器端的相应=A。
而服务器端的连接信息则显示IP地址,端口号及即等于A。
②带选项启动服务器:
服务器端也可以以指定选项的方式启动,
2.2程序:
①Server:
packageniuchunlu;
importjava.io.BufferedReader;
importjava.io.DataOutputStream;
importjava.io.InputStreamReader;
import.ServerSocket;
import.Socket;
publicclassTCPServer{
publicstaticvoidmain(Stringargv[])throwsException
{
StringclientSentence;
StringcapitalizedSentence;
ServerSocketwelcomeSocket=newServerSocket(2345);
System.out.println("服务器正常启动……");
while(true)
{SocketconnectionSocket=welcomeSocket.accept();
BufferedReaderinFromClient=
newBufferedReader(new
InputStreamReader(connectionSocket.getInputStream()));
DataOutputStreamoutToClient=
newDataOutputStream(connectionSocket.getOutputStream());
clientSentence=inFromClient.readLine();
capitalizedSentence=clientSentence.toUpperCase()+'\n';
outToClient.writeBytes(capitalizedSentence);
}
}
}
②Client:
packageniuchunlu;
importjava.io.BufferedReader;
importjava.io.DataOutputStream;
importjava.io.InputStreamReader;
import.Socket;
publicclassTCPClient{
publicstaticvoidmain(Stringargv[])throwsException
{
Stringsentence;
StringmodifiedSentence;
BufferedReaderinFromUser=
newBufferedReader(newInputStreamReader(System.in));
SocketclientSocket=newSocket("127.0.0.1",2345);
DataOutputStreamoutToServer=
newDataOutputStream(clientSocket.getOutputStream());
BufferedReaderinFromServer=
newBufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
sentence=inFromUser.readLine();
outToServer.writeBytes(sentence+'\n');
modifiedSentence=inFromServer.readLine();
System.out.println("FROMSERVER:
"+modifiedSentence);
clientSocket.close();
}
}
三、基于UDP的程序设计
1.基本原理:
UDP是无连接的传输协议,主要用于支持在较可靠的链路上的数据传输,或用于对延迟较敏感的应用。
实现简单,资源占用少,实时性强,适用于可靠性高的网络和延迟敏感的应用。
2.特点:
(1)记录端口信息。
(2)非连接的传送特性。
(3)可以降低对计算机资源的需求。
(4)不必进行数据完整性的检测(不可靠传输)。
(5)适用于多点传送或广播传送等一对多的传送方式。
2.程序调试遇到的问题及解决
2.1错误调试:
2.2程序:
①Server:
packagesocket;
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.IOException;
import.InetAddress;
import.ServerSocket;
import.Socket;
publicclassServer{
publicstaticvoidmain(String[]args){
ServerSocketserver=null;
DataInputStreamdin=null;
DataOutputStreamdout=null;
try{
server=newServerSocket(2000);//定义服务器端的接受对象,并指定接收端口
/*
*端口(Port):
使我们解析输入数据依赖的标记。
*/
System.out.println("服务器启动...");
while(true){
Socketsc=server.accept();
//获得来自客户端的IP
InetAddressip=sc.getInetAddress();//通过socket对象得到客户端IP
System.out.println("收到来自IP:
"+ip+"发送来的消息:
");
intport=sc.getPort();//通过socket对像得到客户端发送这条消息的端口
System.out.println("客户端端口:
"+port);
din=newDataInputStream(sc.getInputStream());
Stringmes=din.readUTF();
System.out.println(mes);
//发送回执消息
dout=newDataOutputStream(sc.getOutputStream());
dout.writeUTF("服务器收到了");
try{
if(din!
=null)
din.close();
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
try{
if(dout!
=null)
dout.close();
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
try{
if(sc!
=null)
sc.close();
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
②Client:
packagesocket;
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.IOException;
import.Socket;
import.UnknownHostException;
importjavax.swing.JOptionPane;
publicclassClient{
publicstaticvoidmain(String[]args){
Socketsc=null;
Stringmes=JOptionPane.showInputDialog("输入发送消息");
DataOutputStreamdout=null;
DataInputStreamdin=null;
try{//捕获异常情况
sc=newSocket("169.254.74.168",2000);//指定发送消息的Socket对象,
dout=newDataOutputStream(sc.getOutputStream());//指定流对象对socket对象指向的服务器进行连接通道
dout.writeUTF(mes);//发送消息
//接收回执消息
din=newDataInputStream(sc.getInputStream());
StringgetMes=din.readUTF();
System.out.println("服务器回执消息:
"+getMes);
}catch(UnknownHostExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
try{
if(dout!
=null)
dout.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
try{
if(sc!
=null)
sc.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
}
四、基于UDP的网络日期计算服务系统
1.系统任务描述:
客户端可以向服务器查询日期。
(1)当前的日期和时间
(2)C给出任意一天,S返回距离现在多少天。
2.协议描述
网络日期计算服务系统是基于UDP协议的,UDP是无连接的传输协议,主要用于支持在较可靠的链路上的数据传输,或用于对延迟较敏感的应用。
实现简单,资源占用少,实时性强,适用于可靠性高的网络和延迟敏感的应用。
3.基本原理
3.1为使程序美观,使用了JFrame和不同的LayoutManager(比如FlowLayout、BorderLayout、GridLayout)进行布局设计,同时限定了窗体的大小;
3.2为将文本框中的字符串转换为日期编写了toDate()方法,其中包括日期输入错误操作的日期时被复用的异常处理;
3.3 因为要实现键盘的输入操作,将操作时使用的几个方法(pressButton等)封装起来,使其可供监听器调
为能通过键盘操作,注册了键盘监听器;
3.4为判断当前是否处于输入状态(否则处于程序提示状态),使用布尔型属性inputing标记当前状态,当其为false时,向文本框中输入字符会先清空文本框;
3.5为实现确定按钮操作、使用了ButtonActionListener方法来监听输入结束或者输入正确,并计算出所输入的日期和当前日期之间的差数。
3.6考虑到DateCalaculator类与客户端和服务端之间的调用关系设计了DateCalaculator类的一些get和set的方法,并通过这些方法的调用来实现参数之间的传递,由此实现了基于UDP的C/S日期服务的计算。
4.程序调试遇到的问题及解决
4.1错误调试:
4.1.1
4.2程序:
①Server:
packagedateCalcutor;
importjava.io.IOException;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
import.InetAddress;
import.ServerSocket;
import.Socket;
publicclassServer{
publicstaticvoidmain(String[]args){
ServerSocketserver=null;
ObjectInputStreamdin=null;
ObjectOutputStreamdout=null;
try{
server=newServerSocket(2222);//定义服务器端的接受对象,并指定接收端口
System.out.println("服务器启动...");
while(true){
Socketsc=server.accept();//会造成线程阻塞
//获得来自客户端的IP
InetAddressip=sc.getInetAddress();//通过socket对象得到客户端IP
System.out.println("收到来自IP:
"+ip+"发送来的消息:
");
intport=sc.getPort();//通过socket对像得到客户端发送这条消息的端口
System.out.println("客户端端口:
"+port);
din=newObjectInputStream(sc.getInputStream());
//DateCalculatordc=(DateCalculator)din.readObject();
//System.out.println(dc);
try{
Thread.sleep(6000);
}catch(InterruptedExceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
//发送回执消息
dout=newObjectOutputStream(sc.getOutputStream());
//dout.writeObject(dc);
try{
if(din!
=null)
din.close();
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
try{
if(dout!
=null)
dout.close();
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
try{
if(sc!
=null)
sc.close();
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
②Client:
packagedateCalcutor;
importjava.io.IOException;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
import.Socket;
import.UnknownHostException;
publicclassClient{
privatestaticDateCalculatordc=newDateCalculator();
publicstaticvoidmain(String[]args){
Socketsc=null;
ObjectOutputStreamdout=null;
ObjectInputStreamdin=null;
//try{
//sc=newSocket("192.168.3.42",2222);//指定发送消息的Socket对象,
//dout=newObjectOutputStream(sc.getOutputStream());//指定流对象对socket对象指向的服务器进行连接通道
//dc.getResult();
//接收回执消息
//din=newObjectInputStream(sc.getInputStream());
//DateCalculatorgetDate=(DateCalculator)din.readObject();
//System.out.println("服务器回执消息:
\n"+(getDate.getResultdate()));
//getDate.getResultdate().setText(getDate+"");
//}//catch(UnknownHostExceptione){
//TODOAuto-generatedcatchblock
//e.printStackTrace();
//}//catch(ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
//e.printStackTrace();
//}//catch(IOExceptione){
//TODOAuto-generatedcatchblock
//e.printStackTrace();
//}//finally{
//try{
//if(dout!
=null)
//dout.close();
//}catch(IOExceptione){
//TODOAuto-generatedcatchblock
//e.printStackTrace();
//}
//try{
//if(sc!
=null)
//sc.close();
//}//catch(IOExceptione)//{
//TODOAuto-generatedcatchblock
//e.printStackTrace();
//}