java网络编程课程设计终极版

java网络编程课程设计终极版
java网络编程课程设计终极版

枣庄学院

信息科学与工程学院课程设计任务书题目:基于UDP的聊天系统

小组成员:谭德鹏、崔浩、王珂、李洪康

成员学号:201212120221、201212120202

201212120224、201212120209 专业班级:网络工程、2012级本2班

课程:Java网络编程

指导教师:吕加国职称:副教授

完成时间:2015年4 月----2015年6 月

枣庄学院信息科学与工程学院制

2015年4 月15日

课程设计任务书及成绩评定

课程设计的任务和具体要求

任务:运用JDK和Eclipse开发环境,完成一个聊天或通讯系统的设计,初步掌握利用Java语言和JDK开发网络通信程序的基本方法。

具体要求:

1、需求分析:根据自己的选题,绘制用例图、功能结构图等。

2、系统设计:合理划分系统的功能结构,写清楚各个功能模块之间的关系。

3、详细设计:根据自己选题的业务逻辑,完成系统的界面设计、代码设计。

4、设计小结:总结课程设计的过程、体会及建议。

6、其他:参考文献等。

指导教师签字:吕加国日期: 2015-11-10 指导教师评语

成绩:____________指导教师签字:日期: 2015-1-10

课程设计所需软件、硬件等

?硬件环境:Iterl(R) Core(TM)2 Duo CPU,主频2.31GHz;内存3G;

硬盘320G以上;1024×768显示分辨率

?软件环境: JDK XXX、Eclipse XXX

课程设计进度计划

起至日期工作内容备注

6月10日~6月20日

我们小组根据所选的题目以及在这学期所学的软件工程的知识,严格按照软件生产的流程(使用的是瀑布模型)来完成此作品,小组成员各职其所,都完成了预期所做的工作!

参考文献、资料索引

序号文献、资料名称编著者出版单位[1]《Java网络编程基础》(第2版).作者:朱喜福戴舒樽王晓勇

摘要 (4)

一、需求分析 (4)

1.1 课程设计目的 (4)

1.2 课程设计的内容 (4)

二 . 概要设计 (5)

2.1 UDP协议的理解 (5)

2.1.1UDP协议定义 (5)

2.1.2UDP协议特点 (5)

2.1.3基于C/S的多客服端相互通信原理分析: (6)

2.2 原理概述 (6)

2.3 界面设计 (7)

三、详细设计 (7)

3.1 聊天界面的设计 (7)

3.2 响应发送按钮 (9)

3.3 测试函数 (10)

四、测试聊天系统 (11)

4.1 聊天界面 (11)

4.2 两台主机间进行通信 (11)

4.3 开始应用聊天系统 (12)

五、总结 (13)

随着网络技术的发展及人们生活的需求,网络聊天已越来越受到人们的青睐。网络聊天已经成为人们工作生活中传递信息、交流感情的重要工具,给人们带来了很大的方便。本课题是开发一个基于UDP的局域网聊天系统,运用软件工程的设计流程,综合运用数据库编程技术、Windows程序设计技术、网络通讯技术,此网络聊天工具采用客户端/服务器(C/S)模式,客户端采用UDP与服务器连接,客户端与客户端之间通过UDP互相通讯。服务器端具有服务器端口设置,此聊天工具能实现多人聊天功能,适用于局域网使用的网络聊天工具,其操作简单,灵活性好,运行也比较稳定。

一、需求分析

1.1 课程设计目的

通过设计网络协议及应用程序来加深理解网络各层的功能和机理,特别是对网络层、运输层、应用层的理解。

独立编写基于UDP的网络应用程序,独立上机调试程序,掌握基于UDP的网络应用基本技术。

培养独立思考问题、分析问题的能力和规范化工程设计的能力。综合运用所学的知识去解决实践中的应用问题,掌握实验技能。为以后的毕业设计与实际工作打下基础。

1.2 课程设计的内容

用户数据报 UDP 是一个无连接协议 使用这种协议时 并不需要在两台计算机之间建立固定的连接 也就是说 通信双方没有服务器和客户机之分 它们之间进行的是对等通信 所以它的优势很明显 是现代通信不可或缺的一部分。所以 利用它的优势设计一个可以聊天的软件 实现两台计算机间的即时通讯。

二 . 概要设计

2.1 UDP协议的理解

2.1.1UDP协议定义

用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。UDP协议直接位于IP(网际协议)协议的顶层。UDP 协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。UDP协议使用端口号为不同的应用保留其各自的数据传输通道。正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。数据报的长度是指包括报头和数据部分在内的总的字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。UDP 协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示,由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。

2.1.2UDP协议特点

1、UDP传送数据前并不与对方建立连接,即UDP是无连接的,在传输数据前,发送方和接收方相互交换信息使双方同步。

UDP不对收到的数据进行排序,在UDP报文的首部中并没有关于数据顺序的2、UDP传送数据前并不与对方建立连接,即UDP是无连接的,在传输数据前,发送方和接收方相互交换信息使双方同步。

3、UDP不对收到的数据进行排序,在UDP报文的首部中并没有关于数据顺序的信息(如TCP所采用的序号),而且报文不一定按顺序到达的,所以接收端无从排起。

4、UDP对接收到的数据报不发送确认信号,发送端不知道数据是否被正确接收,也不会重发数据。

5、UDP传送数据较TCP快速,系统开销也少。

6、由于缺乏拥塞控制(congestion control),需要基于网络的机制来减小因失控和高速UDP流量负荷而导致的拥塞崩溃效应。换句话说,因为UDP发送者不能够检测拥塞,所以像使用包队列和丢弃技术的路由器这样的网络基本设备往往就成为降低UDP过大通信量的有效工具。数据报拥塞控制协议(DCCP)设计成通过在诸如流媒体类型的高速率UDP流中增加主机拥塞控制来减小这个潜在的问题。从以上特点可知,UDP提供的是无连接的、不可靠的数据传送方式,是一种尽力而为的数据交付服务。

2.1.3基于C/S的多客服端相互通信原理分析:

在C/S模式中,它是在分散式,集中式,以及分布式基础上发展起来的一种新模型,目前大多数网络通信以及应用都属于这种模型,C/S模式将一个网络事务分为两部分,一部分是客户端(Client),他为用户提供网络请求服务的接口,另一部分是服务端(Server),它负责接受用户对服务的请求,并将这些服务透明的提供给用户,既适用于实际应用的程序,又实用于真正的计算装置,举例来说,我们到饭店吃饭时,要首先提出请求吃什么,属于客户端,饭店服务员根据请求提供相应的服务,属于服务端,至于相应的饭菜是由哪一个厨师来做,则由饭店的服务员去联系,而客户端只需要和服务器打交道就行了,从程序实现上来说,客户端和服务器打交道实际上是两个进程打交道,服务端启动server进程,并等待客户端与其联系,而客户端则启动客户进程和服务器打交道。当服务器进程处理完一个客服进程请求的信息之后,由接着等待其他客户的请求。

2.2 原理概述

采用UDP协议,通过服务器中转方式。因此,现在的IP侦探在你仅仅跟对方发送聊天消息的时候是无法获取到IP的。UDP 协议是不可靠协议,它只管发送,不管对方是否收到。但它的传输很高效,因为UDP协议排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。例如,腾讯采用了上层协议来保证可靠传输:如果客户端使用UDP协议发出消息后,服务器收到该包,需要使用UDP协议发回一个应答包。如此来保证消息可以无遗漏传输。

2.3 界面设计

在Frame布局容器中,添加一个显示聊天的文本框,在加入Panel面板,Panel 面板中包括文本编辑框。

三、详细设计

3.1 聊天界面的设计

public UDPChat(){

mainJframe = new JFrame("聊天——————UDP协议");

con=mainJframe.getContentPane(); showArea= new JTextArea(); showArea.setEditable(false); showArea.setLineWrap(true);

lal1=new JLabel("接收端口");

lal2=new JLabel("发送端口");

lal3=new JLabel("对方的地址"); sendPortText=new JTextField(); sendPortText.setColumns(5); receivePortText= new JTextField(); receivePortText.setColumns(5); IPAddressText=new JTextField(); IPAddressText.setColumns(8); starBtn=new JButton("开始"); starBtn.addActionListener(this); pane1=new JPanel();

pane1.setLayout(new FlowLayout()); pane1.add(lal1);

pane1.add(receivePortText);

pane1.add(lal2);

pane1.add(sendPortText);

pane1.add(lal3);

pane1.add(IPAddressText);

pane1.add(starBtn);

JSPane = new JScrollPane(showArea); msgText=new JTextField(); msgText.setColumns(40); msgText.setEditable(false); msgText.addActionListener(this); pane2=new JPanel();

pane2.setLayout(new FlowLayout()); pane2.add(msgText);

sendBtn=new JButton();

pane2.add(sendBtn);

con.add(pane1,BorderLayout.NORTH);

con.add(JSPane,BorderLayout.CENTER);

con.add(pane2,BorderLayout.SOUTH);

mainJframe.setSize(600,400);

mainJframe.setVisible(true);

mainJframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }

3.2 响应发送按钮

public void actionPerformed(ActionEvent e){

try{

if(e.getSource() == starBtn){

inBuf=new byte[BUFSIZE];

sendPort = Integer.parseInt(sendPortText.getText());

sendIP=InetAddress.getByName(IPAddressText.getText());

sendSocket=new DatagramSocket();

receivePort=Integer.parseInt(receivePortText.getText());

receivePack=new DatagramPacket(inBuf,BUFSIZE);

receiveSocket=new DatagramSocket(receivePort);

thread = new Thread(this);

thread.setPriority(Thread.MIN_PRIORITY);

thread.start();

starBtn.setEnabled(false);

sendBtn.setEnabled(true);

msgText.setEditable(true);

}else{

outBuf=msgText.getText().getBytes();

sendPack=new

DatagramPacket(outBuf,outBuf.length,sendIP,sendPort);

sendSocket.send(sendPack);

showArea.append("我说:"+msgText.getText()+"\n");

msgText.setText(null);

}

}

catch(UnknownHostException el){

showArea.append("无法连接到指定地址\n");

}catch(SocketException el){

showArea.append("无法打开指定端口\n");

}catch(IOException el){

showArea.append("发送数据失败\n");

}

}

3.3 测试函数

public void run(){

String msgstr;

while(true){

try{

receiveSocket.receive(receivePack);

msgstr=new

String(receivePack.getData(),0,receivePack.getLength());

showArea.append("对方说:"+msgstr+"\n");

}catch(IOException el){

showArea.append("接收数据出错\n");

}

}

四、测试聊天系统

4.1 聊天界面

运行该聊天系统,显示聊天界面

4.2 两台主机间进行通信

填入对方主机的ip地址,接收端口为对方主机的发送端口,点击开始按钮,两台主机间就可以进行通信了,测试结果如下图:

主机1

主机2

4.3 开始应用聊天系统

通过主机1向主机2发送一段文字,点击回车键可以发送,这是主机2的聊天界面上可以显示主机1发送的聊天内容。主机2回复给主机1一段文字,主机1的聊天界面上也可以显示。测试成功,两台主机间可以进行交流。

五、总结

这次实验是在边学习边实践的基础上完成的,通过学习“网络编程”,我们对网络的基础知识打下了很好的基础。这次网络实验可以说是在理解网络的基础上对编程的一次学习过程,虽然做的不是很完善,但也学到了很多知识。开发一个专用于实现两台计算机之间即时通讯的软件,以方便两台计算机之间信息的

交流。,在连接并通信时,尤其是近程的即时通讯,彻底的脱离了远程的服务器,避免了和远程服务器连接时过多的浪费网络资源。并且避免了服务器忙或与服务器无法连接时,浪费过多时间用于和服务器建立连接!因此,这个软件是极具适应性和实用性的即时通讯软件!本次课程设计的目的是学习基于UDP协议实现网络聊天程序,已达到学会面向无连接方式的程序设计方法,并理解网络编程中面向无连接的概念。

相关主题
相关文档
最新文档