当前位置:文档之家› 网络编程课程设计-简单的聊天室程序设计分析

网络编程课程设计-简单的聊天室程序设计分析

网络编程课程设计-简单的聊天室程序设计分析
网络编程课程设计-简单的聊天室程序设计分析

《网络编程技术课程设计》论文2012 — 2013学年第二学期

题目:UDP聊天程序

专业班级:网络10-5班

学号:311009040504

姓名:王亚歌

指导老师:张俊

日期:2013-6-25

目录

一、引言 (2)

二、基础理论 (2)

1、UDP协议简介 (2)

2、系统需求分析 (3)

三、功能设计 (4)

1、设计目的 (4)

2、设计要求 (4)

四、系统实现 (5)

1、原理概述 (5)

2、程序设计流程 (5)

五、设计过程 (6)

1、程序设计流程及源代码 (6)

源代码 (6)

主机A (6)

主机B (10)

2、调试分析过程描述 (15)

3、结果分析 (15)

六、结论 (16)

[参考文献] (16)

一、引言

随着计算机科学和Internet 的飞速发展,网上聊天室已成为人们相互交流的一种方式,与E—mail 电话相比,聊天服务更具有实时性和有效性。本课题是java基于UDP协议的聊天程序。聊天室分为客户端和服务器端,服务器端程序主要用来负责侦听客户发来的消息,客户端需要等服务器登录成功以后检测到服务器存在的情

【关键词】UDP 协议;网络聊天室;.Windows Socket 网络编程

二、基础理论

1、UDP协议简介

Windows Socket 网络编程简介Windows Sockets 规范本意在于提供给应用程序开发者一套简单的API,使应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。现在的Windows Sockets 已经基本上实现了与协议无关,你可以使用Windows Sockets 来调用多种协议的功能,但较常使用的是TCP/IP 协议。

Socket 实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket 接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket 接口来实现。微软为VC 定义了Windows Sockets 类如CAsyncSocket 类和派生于CAsyncSocket 的CSocket 类,它们简单易用。根据传输数据类型的不同,Socket 主要分为三类:1)流式Socket(SOCK—STREAM),在这种方式下,两个通讯的应用程序之闻要先建立一种虚拟的连接,提供可靠的、面向连接的通信流,它使用”TCP” 协议。从而保证了数据传输的正确性和顺序的。2) 数据报Socket(SOCK—DGRAM),它使用数据报协议UDP,定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠、无差错。3)原始Socket,原始套接字允许对底层协议如IP 或ICMP 直接访问,它功能强大但使用较为不便,主要用于一些协议的开发。

UDP 协议简介UDP 协议是一个面向无连接的协议。其连接的建立不必像TCP 那样需要服务器端侦听,也不需要有客户机请求连接,属于一种“强制”

性的网络连接。提供一对一或一对多的、UDP 无连接的数据报服务。该服务对消息中传输的数据提供不可靠的、最大努力的传送,这意味着它不保证数据的到达,也不保证所传送的数据报的顺序是否正确,UDP 不重新传输丢失的数据。其主要工作是:将应用程序传输过来的数据分块交给网络层,确认接受到分组信息。

尽管UDP 无法像TCP 一样提供可靠的数据传输,但UDP 并不比TCP 缺乏优越性。UDP 在传输效率方面比TCP 要高一些,而且许多应用程序并不需要保证严格的传输可靠性,比如视频会议系统等,需要实时的交互,但并不要求音频视频的绝对正确。

● UDP 优缺点:1.UDP 不要求保持一个连接;2.UDP 没有因接收方认可收到数据包(或者当数据包没有正确抵达而自动重传)而带来的开销;3.设计UDP 的目的是用于短应用和控制消息;4.在一个数据包连接一个数据包的基础上,UDP 要求的网络带宽比TCP 更小。

2、系统需求分析

(一)客户需求分析分析客户的需求,这里只列出比较核心的部分。(1) 只限于局域网内聊天。(2) 简易的操作界面。。(3) 可以同时与多个人聊天。

(4) 可以保存聊天记录。

(二)性能需求分析(1)可靠性高,能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程序,在出现不可知的错误以后,可以尽量安全的退出程序。在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的事件,并能在判断事件后做出相应的处理,使程序具有较高的容错性能。(2)宜操作性,程序简单易懂,容易上手使用。设计界面是,简化界面的复杂性,模拟QQ 等现有即时通讯工具的界面,使用户能很容易看懂并使用。(3)开发文档易理解,保证以后自己开发时,能够清晰的理解整个系统的设计思路和实现细节。(4)模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于维护与扩展。

(三)运行需求分析(1)用户界面程序较小,启动速度快,无启动界面。

在本地局域网中使用,所以无需进行用户登录,无需认证界面,启动后的应用界面要清爽,设计要简单明了,要具有较高的易用性。(2)故障处理在遇到可预知的故障与情况时,能提示用户并自动退出;在遇到不可预知的故障时能安全退出。

三、功能设计

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

1、课程设计的内容

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

2、课程设计要求

基于UDP协议实现一对一的聊天的聊天,提供友好的用户界面,便于用户进行操作。根据目前使用聊天程序的用户需求显示,用户对于聊天程序主要有以下几点要求:

(1)聊天功能:可以实现实时接收和发送文字信息,并能支持公聊和私聊的方式。

(2)用户功能:可以查看对方的开放信息,以及发送方的IP

四、系统实现

1、原理概述

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

2、程序的开发步骤如下:

1、创建UDPmessage类,继承JFrame成为框体类,并实现

ActionListener接口。该类中包括多个成员变量,它们分别是信息

接收文本域,信息发送文本框,IP文本框、“发送”按钮和数据包套

接字。

2、在构造方法中初始化窗体组间,并将组间布局到窗体中,然后调用

Server()方法创建数据包套接字,并添加“发送”按钮的事件监听

器。

3、编写Server()方法,该方法负责创建DatagramSocket数据包套接

字和接收信息的DatagramPacket数据包,最重要的是,该方法在线

程中使用无限循环实现数据包的接收,这是网络程序设计必须掌握的

接收数据的方法,这样才能保证数据的持续接收。然后获取数据包中

的IP信息,也就是数据包发送者的IP地址,这个IP地址将随数据

包中的信息一起添加到信息接收文本域中,以区分信息的发布者。

4、实现ActionListener借口中的actionPerformed()方法,该方法

用于处理“发送”按钮的单击事件,它需要获取ip文本框中的IP信

息,这个IP地址将绑定到准备发送的数据包中。

5、编写本类的main()主方法,只需简单地创建主窗体对象就可以了。

6 . 在两台计算机上分别运行,修改IP文本框中的IP地址为接收一方的IP,输入内容点击放松就可以接收了。

五、设计过程

实现代码如下:

主机A的代码:

package qq;

import java.awt.*;

import java.awt.event.*;

import java.io.IOException;

import https://www.doczj.com/doc/569600709.html,.*;

import javax.swing.*;

public class UDPmessage extends JFrame implements ActionListener { /**

*

*/

private static final long serialVersionUID = 1L;

private JTextArea text;//信息接收文本域

private JTextField ipText;//IP文本框

private JTextField sendText;//信息发送文本框

private JButton button;//发送按钮

private DatagramSocket socket;//数据报套接字

private JScrollBar vsBar;//滚动条

public UDPmessage(){

setTitle("UDP聊天程序");//设置窗体标题

setBounds(100,100,400,300);//窗体定位与大小

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//默认关闭操作为退出程序

setLayout(new BorderLayout());//窗体使用边界布局管理器

text=new JTextArea();//实例化信息接收文本域

text.setEditable(false);//信息接收文本域不可编辑

JScrollPane textPanel=new JScrollPane(text);//信息接收文本域添加滚动面板

vsBar=textPanel.getVerticalScrollBar();//获取滚动面板的垂直滚动条

add(textPanel,BorderLayout.CENTER);//添加滚动面板到窗体居中位置

JPanel panel=new JPanel();//创建panel面板

BorderLayout panelLayout=new BorderLayout();//创建边界布局管理器

panelLayout.setHgap(5);//设置布局水平边界

panel.setLayout(panelLayout);//将布局管理器注入panel面板

ipText=new JTextField("122.206.73.14");//实例化IP文本框(请输入你自己IP地址)

panel.add(ipText,BorderLayout.WEST);//添加文本框到panel面板

sendText=new JTextField();//实例化信息发送文本框

panel.add(sendText,BorderLayout.CENTER);//添加信息发送文本框到panel

button=new JButton("发送");//实例化发送按钮

panel.add(button,BorderLayout.EAST);//添加按钮到panel面板

add(panel,BorderLayout.SOUTH);//添加面板到窗体

setVisible(true);//显示窗体

server();//调用Server()方法

button.addActionListener(this);//添加按钮事件监听器

}

private void server(){

try{

socket=new DatagramSocket(9527);//实例化数据报套接字

byte[] buf=new byte[1024];

final DatagramPacket dpl=new DatagramPacket(buf,buf.length);//创建接收数据的数据包

Runnable runnable=new Runnable(){//定义线程

public void run(){

while(true){ //使用无限循环体

try{

Thread.sleep(100);//线程休眠时间为100ms

socket.receive(dpl);//接收数据包

int length=dpl.getLength();

String message=new String(dpl.getData(),0,length);//获取数据包的字符串信息

String ip=dpl.getAddress().getHostAddress();

if(!InetAddress.getLocalHost().getHostAddress().equals(ip))

text.append(ip+":\n "+message+"\n");

vsBar.setValue(vsBar.getMaximum());//控制信息滚动

}catch(IOException e){

e.printStackTrace();

}catch(InterruptedException e){

e.printStackTrace();

}

}

}

};

new Thread(runnable).start();

}catch(SocketException e){

e.printStackTrace();

}

}

public void actionPerformed(ActionEvent ev){

try{

String ip=ipText.getText();//获取IP文本框内容

InetAddress address=InetAddress.getByName(ip);

byte[] data=sendText.getText().getBytes();//获取发送的数据

DatagramPacket dp=new DatagramPacket(data,data.length,address,9527);//定义数据包

String myip=InetAddress.getLocalHost().getHostAddress();//获取本机IP

//将发送信息添加到信息接收文本域中

text.append(myip+":\n "+sendText.getText()+":\n");

socket.send(dp);//发送数据包

sendText.setText(null);

}catch(UnknownHostException e){

e.printStackTrace();

}catch(IOException e){

e.printStackTrace();

}

}

public static void main(String[] args) {

UDPmessage udp= new UDPmessage();

udp.setVisible(true);

}

}

运行后的对话框

主机B的代码:

package qq;

import java.awt.*;

import java.awt.event.*;

import java.io.IOException;

import https://www.doczj.com/doc/569600709.html,.*;

import javax.swing.*;

public class UDPmessage extends JFrame implements ActionListener { /**

*

*/

private static final long serialVersionUID = 1L;

private JTextArea text;//信息接收文本域

private JTextField ipText;//IP文本框

private JTextField sendText;//信息发送文本框

private JButton button;//发送按钮

private DatagramSocket socket;//数据报套接字

private JScrollBar vsBar;//滚动条

public UDPmessage(){

setTitle("UDP聊天程序");//设置窗体标题

setBounds(100,100,400,300);//窗体定位与大小

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//默认关闭操作为退出程序

setLayout(new BorderLayout());//窗体使用边界布局管理器

text=new JTextArea();//实例化信息接收文本域

text.setEditable(false);//信息接收文本域不可编辑

JScrollPane textPanel=new JScrollPane(text);//信息接收文本域添加滚动面板vsBar=textPanel.getVerticalScrollBar();//获取滚动面板的垂直滚动条

add(textPanel,BorderLayout.CENTER);//添加滚动面板到窗体居中位置

JPanel panel=new JPanel();//创建panel面板

BorderLayout panelLayout=new BorderLayout();//创建边界布局管理器

panelLayout.setHgap(5);//设置布局水平边界

panel.setLayout(panelLayout);//将布局管理器注入panel面板

ipText=new JTextField("122.206.73.136");//实例化IP文本框(请输入你自己IP 地址)

panel.add(ipText,BorderLayout.WEST);//添加文本框到panel面板

sendText=new JTextField();//实例化信息发送文本框

panel.add(sendText,BorderLayout.CENTER);//添加信息发送文本框到panel button=new JButton("发送");//实例化发送按钮

panel.add(button,BorderLayout.EAST);//添加按钮到panel面板

add(panel,BorderLayout.SOUTH);//添加面板到窗体

setVisible(true);//显示窗体

server();//调用Server()方法

button.addActionListener(this);//添加按钮事件监听器

}

private void server(){

try{

socket=new DatagramSocket(9527);//实例化数据报套接字

byte[] buf=new byte[1024];

final DatagramPacket dpl=new DatagramPacket(buf,buf.length);//创建接收数据的数据包

Runnable runnable=new Runnable(){//定义线程

public void run(){

while(true){ //使用无限循环体

try{

Thread.sleep(100);//线程休眠时间为100ms

socket.receive(dpl);//接收数据包

int length=dpl.getLength();

String message=new String(dpl.getData(),0,length);//获取数据包的字符串信息

String ip=dpl.getAddress().getHostAddress();

if(!InetAddress.getLocalHost().getHostAddress().equals(ip))

text.append(ip+":\n "+message+"\n");

vsBar.setValue(vsBar.getMaximum());//控制信息滚动

}catch(IOException e){

e.printStackTrace();

}catch(InterruptedException e){

e.printStackTrace();

}

}

}

};

new Thread(runnable).start();

}catch(SocketException e){

e.printStackTrace();

}

}

public void actionPerformed(ActionEvent ev){

try{

String ip=ipText.getText();//获取IP文本框内容

InetAddress address=InetAddress.getByName(ip);

byte[] data=sendText.getText().getBytes();//获取发送的数据

DatagramPacket dp=new DatagramPacket(data,data.length,address,9527);//定义数据包

String myip=InetAddress.getLocalHost().getHostAddress();//获取本机IP

//将发送信息添加到信息接收文本域中

text.append(myip+":\n "+sendText.getText()+":\n");

socket.send(dp);//发送数据包

sendText.setText(null);

}catch(UnknownHostException e){

e.printStackTrace();

}catch(IOException e){

e.printStackTrace();

}

}

public static void main(String[] args) {

UDPmessage udp= new UDPmessage();

udp.setVisible(true);

}

}

运行后的界面

实现对话后,主机A的显示:

主机B的显示:

2、调试分析与过程总结

1遇到的问题和解决方法:

在创建窗体时,由于对有些控件不了解,所以在应用时,查找了一些相关资料,学会了如何添加和使用。其中有段程序是选择现有文件夹里的ico图标,但是由于没有把图片放在指定的地方,所以在运行时,总是提示找不到指定的文件。这个程序中功能是选择要聊天的任何一个IP可以进行聊天,但因我的能力有限,不能搭建如多人群聊,群众私聊等功能。在运行时需将ip地址改成对方主机ip,所以显示出了此程序的另一个不足,在运行时比较麻烦,我试图改进过此程序,但都以失败告终,此课程设计让我充分认识到了自己的不足,我今后会更加努力,完成属于自己的多功能聊天程序。

2心得体会

这个程序中功能是选择要聊天的任何一个IP可以进行聊天,但因我的能力有限,不能搭建如多人群聊,群众私聊等功能。在运行时需将ip地址改成对方主机ip,所以显示出了此程序的另一个不足,在运行时比较麻烦,我试图改进过此程序,但都以失败告终,此课程设计让我充分认识到了自己的不足,我今后会更加努力,完成属于自己的多功能聊天程序。

结论

通过这次课程设计,使我对网络编程和eclipse有了更进一步的认识和了解,也让我学会了java和eclipse基本操作的一些知识。要想学好网络编程要重在实

践,必须通过不断的实践操作才能更好地掌握它。我也发现我的好多不足之处,首先是自己在基础上还不行,经常出错,通过学习已有所改进;再有对java的一些类不太了解,还有对函数调用的正确使用不够熟悉,还有对eclipse中经常出现的错误也不了解,通过实践的学习,我认识到学好计算机要重视实践操作,不仅仅是学习java语言,还是其它的语言和学科,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己更好地学好计算机。

参考文献

[1] 耿祥义编著《java课程设计》清华大学出版社2004版

[2] Y .Daniel Liang 著《java语言程序设计》机械工业出版社

相关主题
文本预览
相关文档 最新文档