计算机网络实验报告(UDP服务器及简单聊天系统).docx
《计算机网络实验报告(UDP服务器及简单聊天系统).docx》由会员分享,可在线阅读,更多相关《计算机网络实验报告(UDP服务器及简单聊天系统).docx(27页珍藏版)》请在冰豆网上搜索。
计算机网络
课程设计报告
设计名称:
①UDP服务器的设计
②简单聊天程序的设计与实现
专 业:
计算机科学与技术(交通信息工程)班 级:
2013240203
姓 名:
孙康指导教师:
徐丽
2015年12月25日
课设一:
UDP服务器的设计
摘要:
UDP是TCP/IP协议族为传输层设计的两个协议之一,它在进程与进程通信过程中,提供了有限的差错校验功能,是一种无连接的,不可靠的协议。
UDP在一个较低的水平上完成进程之间的通信,在收到分组的时候没有流量控制机制也没有确认机制,适用于可靠性比较高的局域网。
由于UDP采取了无连接的方式,因此协议简单,在一些特定的应用中协议运行效率高。
UDP适合一些实时的应用,如IP电话、视频会议,它们要求源主机以恒定的速率发送数据,并且在网络出现拥塞时,可以丢失一些数据,但是延迟不能太大。
基于这些特点,流式多媒体通信、多播等应用在传输层采用的就是UDP协议。
本次课设以Eclipse作为开发平台,java为开发语言模拟实现了多客户端连接访问UDP服务器的过程。
关键词UDP;服务器;客户端;java
1、引言
UDP是TCP/IP协议族为传输层设计的两个协议之一,它在进程与进程通信过程中,提供了有限的差错校验功能,是一种无连接的,不可靠的协议。
UDP在一个较低的水平上完成进程之间的通信,在收到分组的时候没有流量控制机制也没有确认机制,适用于可靠性比较高的局域网。
由于UDP采取了无连接的方式,因此协议简单,在一些特定的应用中协议运行效率高。
1、课程设计目的:
UDP是TCP/IP协议族为传输层设计的两个协议之一,是一种无连接的,不可靠的协议。
由于UDP采用了无连接的方式,因此协议简单,在一些特定的应用中协议运行效率高。
UDP适合一些实用的应用,如IP电话、视频会议,它们要求源主机以恒定的速率发送数据,并且在网络拥塞时,可以丢失一些数据,但是延迟不能太大。
基于这些特点,流式多媒体通信、多播等应用在传输采用的就是UDP协议。
2、课程设计要求:
编写程序,设计UDP服务器。
因为考虑到实时性,所以选择UDP为主要的网络通信技术。
(1)程序能流畅地完成视频文件的传输(实际由于时间的问题和网络编程的知识掌握较少没
有实现这个功能)。
(2)要能对多个客户端进行管理。
需要通过UDP模拟多个客户端连接验证的情况。
3、设计平台
Windows8.1操作系统,Eclipse
2、设计原理
UDP服务器的设计主要应用了四个方面的技术。
1)UDP协议技术。
UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
2)JAVA编程技术。
Java对网络编程提供了很好的封装,包中的类和接口提供了可用于低层和高层网络编程的API。
低层API可以让你直接访问Socket,为网络设计提供了不少方便,java还提供了高度封装和高性能的io流API便于发送和读取消息.
3)TCP/IP协议技术。
在TCP/IP协议族中,有两个互不相同的传输协议:
TCP(传输控制协议)和UDP(用户数据报协议)。
TCP为两台主机提供高可靠性的数据通信。
它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。
由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。
而另一方面,UDP则为应用层提供一种非常简单的服务。
它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。
任何必需的可靠性必须由应用层来提供。
4)、JAVASocket编程。
所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。
应用程序通常通过"套接字"向网络发出请求或者应答网络请求.在JAVA中Socket和ServerSocket类库位于包中。
ServerSocket用于服务器端,Socket是建立网络连接时使用的。
在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,
完成所需的会话。
对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。
3、程序代码设计流程
1、主程序流程图
Scoket()
Scoket()
绑定客户端
发送信息
等待客户请求
接收信息
发送信息
发送信息
绑定服务器端
服务请求
处理服务请求
服务应答
关闭
关闭
服务器 客户端
2、.设计中的重点及难点:
1)如何把发送和接收两部分结合在一起。
3、UDP服务器的具体设计过程:
设计UDP服务器的过程如下所示。
首先,创建一个SOCKET并监听事件。
然后,启动线程接收数据。
这样,客户就有机会处理这一事件并作一些动作。
最后,当客户断开时,向服务器发送一个事件,服务器就可以做出回应。
其中最关键的部分就是收发部分和数据处理部分。
1)客户端发送信息
socket=newSocket("127.0.0.1",8890);//定义套接字writer=newPrintWriter(socket.getOutputStream());
writer.println("客户端说:
"+"你好,服务器!
");writer.flush();//发送信息并清空缓存
2)客户端接收信息
reader=newBufferedReader(newInputStreamReader(socket.getInputStream()));
System.out.println("服务器说:
"+reader.readLine());
3)服务器端发送信息
writer=newPrintWriter(socket.getOutputStream());writer.println("欢迎光临!
");
writer.flush();//发送信息并清空缓存
4)服务器端接收信息
Socketsocket=sk.accept();System.out.println("客户端信息:
"+
Thread.currentThread()
+socket.getRemoteSocketAddress()+"连接上!
");reader=newBufferedReader(newInputStreamReader(
socket.getInputStream()));System.out.println(reader.readLine());//打印读取的第一行
5)整个程序的运行过程
服务器并不是主动地建立连接,他们是被动地监听一个客户端的连接请示,然后给予他们服务。
服务器是由类ServerSocket来建立的。
下面的程序建立了一个服务器端socket并把它绑定到8890端口:
ServerSocketserverSocket=newServerSocket(8890,50);
第一个参数是服务端要监听的端口,第二个参数是可选的。
API文档中说明了这是一个监听时间,但是在传统的socket程序中第二个参数是监听深度。
一个服务器可以同时监听多个连接请求,但每次只能处理一个。
监听堆是一个无回答的连接请求队列,上面的请求建立一个连接来处理最后五个请求。
如果省略了后面的一个参数,则默认值是50。
一旦socket建立了并开始监听连接,进来的连接将会建立并放在监听堆。
accetp()方法把在堆中的连接取出来.
SocketclientSocket=serverSocket.accept();
这个方法返回一个用来与来访者对话的客户端连接.服务器本身不可能建立对话,相反地,服务器socket会使用accept()方法来产生一个新的socket.服务器socket依旧打开并排列新的连接请求.
与客户端socket一样,下面的一步建立输入和输出流:
BufferedReader reader = new BufferedReader(newInputStreamReader(socket.getInputStream()));
PrintWriter writer = new
PrintWriter(socket.getOutputStream());
一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端 发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?
那个方法将会等待一个的到来.这个行为叫阻塞.accept()方法将会阻塞服务器线程直到一个呼叫到来.当5个连接处理完闭之后服务器退出.任何的在队列中的呼叫将会被取消.
4、核心代码:
publicvoidrun(){BufferedReaderreader=null;PrintWriterwriter=null;
try{
sk=newServerSocket(8890);System.out.println("我在8890端口监听!
");while(true){
Socketsocket=sk.accept();
System.out.println("客户端信息:
"+Thread.currentThread()
+socket.getRemoteSocketAddress()+"连接上!
");reader=newBufferedReader(newInputStreamReader(
socket.getInputStream())); //从读缓冲区中读入套接字的输入字符流System.out.println(reader.readLine());//输出读入字符流的内容
writer=newPrintWriter(socket.getOutputStream());writer.println("欢迎光临!
");
writer.flush();
try{
TimeUnit.MILLISECONDS.sleep(3000);
}catch(Exceptione){
e.printStackTrace();
}
if(reader.readLine()==null){
System.out.println("客户端:
"+socket.getRemoteSocketAddress()
+"断开连接!
");System.out.println();
}
}
}catch(IOExceptione){e.printStackTrace();
}finally{
try{
if(writer!
=null)
writer.close();if(writer!
=null)
reader.close();
}cat