计算机网络实验报告(UDP服务器及简单聊天系统)Word格式文档下载.docx
《计算机网络实验报告(UDP服务器及简单聊天系统)Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机网络实验报告(UDP服务器及简单聊天系统)Word格式文档下载.docx(27页珍藏版)》请在冰点文库上搜索。
由于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()
绑定客户端
发送信息
等待客户请求
接收信息
绑定服务器端
服务请求
处理服务请求
服务应答
关闭
服务器 客户端
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);
我在8890端口监听!
while(true){
+Thread.currentThread()
//从读缓冲区中读入套接字的输入字符流System.out.println(reader.readLine());
//输出读入字符流的内容
TimeUnit.MILLISECONDS.sleep(3000);
}catch(Exceptione){
e.printStackTrace();
}
if(reader.readLine()==null){
客户端:
+socket.getRemoteSocketAddress()
+"
断开连接!
System.out.println();
}catch(IOExceptione){e.printStackTrace();
}finally{
if(writer!
=null)
writer.close();
if(writer!
reader.close();
}catch(Exceptione){e.printStackTrace();
4、结果及分析
1、运行结果:
(1)客户端的运行结果是:
(2)服务器端的运行结果是:
分析:
服务器能够监听客户端的连接以及断开连接,并且允许多个客户端并发访问
五、结束语
本次课程设计为时一周,我选的第一个课题是UDP服务器设计,其主要研究内容在于实现文件的传输及接收。
经过课堂的讲解已经了解到了UDP的定义,即确定UDP究竟是个什么协议,它有些什么性质和特征,它应用于那些方面。
经过了解知道了UDP是TCP/IP协议族为传输层设计的两个协议之一,它在进程与进程的通信过程中,提供了有限的差错校验功能,是一种无连接的、不可靠的协议。
分析后知道了UDP其实就是用来实现网络中文件的传输和接收的协议。
然后就开始思考具体的UDP实现的程序,该程序分为客户端和服务器端两部分,客户端主要是执行文件或消息的发送,服务器端则主要是接收这些内容。
而且这次的课程设计过程中,我接触到了全新的编程方法socket,使我学到了新知识。
6、源代码:
Server:
packageservice;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;
import.ServerSocket;
import.Socket;
importjava.util.concurrent.TimeUnit;
publicclassUdpService{
privateServerSocketsk;
//定义一个套接字服务
publicvoidrun(){
BufferedReaderreader=null;
publicstaticvoidmain(String[]args)throwsInterruptedException{newUdpService().run();
Client:
packageclient;
import.Socket;
import.UnknownHostException;
importjava.util.concurrent.TimeUnit;
publicclassUdpClientimplementsRunnable{privateSocketsocket=null;
publicSocketgetSocket(){returnsocket;
@Overridepublicvoidrun(){
PrintWriterwriter=null;
try{
}catch(UnknownHostExceptione){e.printStackTrace();
reader.close();
socket.close();
publicstaticvoidmain(Stringargs[]){UdpClientclient=newUdpClient();
Threadthread=newThread(client);
thread.start();
TimeUnit.MILLISECONDS.sleep(2000);
client.getSocket().close();
7、参考文献:
[1]吴功宜﹑胡晓英﹑张仁﹑何云﹑王宁.计算机网络课程设计.机械工业出版社,2007年12月
[3]谢希仁.计算机网络(第6版).电子工业出版社,2013年06月
课设二:
简单聊天程序
在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。
基于Java网络编程的强大功能,本次课程设计使用Java编写一个简单的聊天系统。
聊天程序主要采用的是C/S模式,因此在此次课设中建立了服务器以及用户交互的客户端。
Java的网络编程中通过Socket套接字建立连接,服务器能读取、转发客户端发来信息,并且对信息的读取、发送,是利用流来实现信息的交换,能实现汉字的读取与显示。
客户端可以将服务器转发过来的消息全部显示在各自的交互界面上,从而实现了群聊功能。
本程序采用Eclipse为基本开发环境和java语言进行编写,实现多个用户同时聊天。
关键词Socket;
一、引言
随着网络的普及,而聊天工具作为网络的次生品之一,越来越受到人们的青睐。
而网络架构的模式无非是C/S或者是B/S两种模式。
聊天系统大多使用的是C/S模式,服务器作为终端接收和处理各种客户端的请求,以满足客户的需要。
而客户端作为与用户进行交互的一端便于用户操作。
主要使用的是TCP、UDP两种传输控制协议,以提供方便快捷的服务。
而聊天系统正是建立在这两种技术上的一种综合应用。
聊天程序是上网时经常使用的网络程序,通过它大家彼此之间可以交流信息。
本设计要求完成一个聊天程序的简单设计与实现。
通过聊天程序的设计与实现,可以达到如下目的:
掌握网络编程的知识和技能;
熟悉网络软件的开发过程,锻炼解决实际问题的能力。
(1)在客户端界面上显示所有联入聊天服务器的用户。
(2)增加用户的个人信息修改、保存和查询。
(3)在聊天内容中支持图片、视频等多种媒体信息;
(4)支持增加好友的功能,好友上线时如果该用户在线,则做出提醒;
(5)支持在用户之间传输文件等附件;
在设计实现的时候由于时间紧张,以及自己对java的Socket编程方面的知识掌握的还不够好,因此只是实现了多个客户之间以文本为消息格式的群聊。
Windows8.1操作系统、Eclipse
二、设计原理
聊天系统的核心技术是设计服务器和客户端这两部分,这里用到了TCP网络编程的内容。
1、服务器部分:
服务器端通过循环一直从客户端接收信息,并通过线程实现多个客户端连接。
服务器发送信息则通过定义链表保存客户端信息。
每个客户端向服务器发送信息时,则通过链表中的所有客户端的连接而发送信息给所有客户端界面从而实现局域网内多人聊天。
2、客户端部分:
主要是界面的编写,通过一个线程一直从服务器获取信息,如果不为空时就在界面上显示。
三、程序代码设计流程
服务器ServerSocket
监听
客户端Socket
发送连接请求
接受客户端请求
结束
关闭服务器
读写操作
执行相应的读写操作
1)服务器要把客户端发送到的消息转发给各个客户端。
2)各个客户端消息的时刻刷新。
3、核心代码:
publicServer(){
server=newServerSocket(8900);
//创建服务器,用Socket实现对它们的监听
}catch(IOExceptione1){e1.printStackTrace();
等待服务器被连接。
。
//连接服务器时的输出内容
booleanflag=true;
//设置变量来标记连接入服务器是否成功
while(flag){
synchronized(this){ //设置同步锁,防止在多线程时产生死锁现象
client=server.acce