2022年网络编程课程设计-简单的聊天室程序设计 .pdf
1 网络编程技术课程设计论文2012 2013 学年第二学期题目:UDP 聊天程序专业班级:网络 10-5 班学号:311009040504 姓名:王亚歌指导老师:张俊日期:2013-6-25 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 17 页 - - - - - - - - - 2 目 录一、引言 2 二、基础理论 2 1、UDP 协议简介 2 2、系统需求分析 3 三、功能设计 4 1、设计目的 4 2、设计要求 4 四、 系统实现 5 1、原理概述 5 2、程序设计流程 5 五、 设计过程 6 1、程序设计流程及源代码6 源代码 6 主机 A6 主机 B10 2、调试分析过程描述 15 3、结果分析 15 六、结论 16 参考文献 16 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 17 页 - - - - - - - - - 3 一、 引言随着计算机科学和Internet 的飞速发展,网上聊天室已成为人们相互交流的一种方式,与Email 电话相比,聊天服务更具有实时性和有效性。本课题是 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(SOCKSTREAM) ,在 这种方式下,两个通讯的应用程序之闻要先建立一种虚拟的连接,提供可靠的、面向连接的通 信 流 , 它 使 用 ”TCP ” 协议 。 从 而保证了数据传输 的 正 确 性 和 顺 序 的 。 2) 数 据 报Socket(SOCKDGRAM) ,它使用数据报协议UDP,定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠、无差错。3)原始 Socket,原始套接字允许对底层协议如IP 或 ICMP 直接访问,它功能强大但使用较为不便,主要用于一些协议的开发。UDP 协议简介UDP 协议是一个面向无连接的协议。 其连接的建立不必像TCP 那样需要服务器端侦听,也不需要有客户机请求连接,属于一种 “ 强制 ”名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 17 页 - - - - - - - - - 4 性的网络连接。提供一对一或一对多的、UDP 无连接的数据报服务。该服务对消息中传输的数据提供不可靠的、最大努力的传送,这意味着它不保证数据的到达,也不保证所传送的数据报的顺序是否正确,UDP 不重新传输丢失的数据。其主要工作是: 将应用程序传输过来的数据分块交给网络层,确认接受到分组信息。尽管 UDP 无法像TCP 一样提供可靠的数据传输,但UDP 并不比 TCP 缺乏优越性。 UDP 在传输效率方面比TCP 要高一些,而且许多应用程序并不需要保证严格的传输可靠性,比如视频会议系统等, 需要实时的交互, 但并不要求音频视频的绝对正确。 UDP 优缺点:1UDP 不要求保持一个连接;2UDP 没有因接收方认可收到数据包(或者当数据包没有正确抵达而自动重传)而带 来的开销; 3 设计 UDP 的目的是用于短应用和控制消息;4在一个数据包连接一个数据包的基础上, UDP 要求的网络带宽比TCP 更小。2、系统需求分析(一) 客户需求分析分析客户的需求,这里只列出比较核心的部分。(1) 只限于局域网内聊天。(2) 简易的操作界面。 (3) 可以同时与多个人聊天。(4) 可以保存聊天记录。(二)性能需求分析(1)可靠性高,能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程序,在出现不可知的错误以后,可以尽量安全的退出程序。在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的事件,并能在判断事件后做出相应的处理,使程序具有较高的容错性能。(2)宜操作性,程序简单易懂,容易上手使用。设计界面是,简化界面的复杂性,模拟QQ 等现有即时通讯工具的界面,使用户能很容易看懂并使用。(3)开发文档易理解,保证以后自己开发时, 能够清晰的理解整个系统的设计思路和实现细节。(4) 模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于维护与扩展。(三)运行需求分析(1)用户界面 程序较小,启动速度快,无启动界面。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 17 页 - - - - - - - - - 5 在本地局域网中使用,所以无需进行用户登录,无需认证界面,启动后的应用界面要清爽,设计要简单明了,要具有较高的易用性。(2)故障处理在遇到可预知的故障与情况时,能提示用户并自动退出;在遇到不可预知的故障时能安 全退出。三、功能设计开发一个专用于实现两台计算机之间即时通讯的软件,以方便两台计算机之间信息的交流。,在连接并通信时,尤其是近程的即时通讯,彻底的脱离了远程的服务器,避免了和远程服务器连接时过多的浪费网络资源。并且避免了服务器忙或与服务器无法连接时, 浪费过多时间用于和服务器建立连接!因此,这个软件是极具适应性和实用性的即时通讯软件!本次课程设计的目的是学习基于UDP 协议实现网络聊天程序,已达到学会面向无连接方式的程序设计方法,并理解网络编程中面向无连接的概念。1、课程设计的内容用户数据报( UDP)是一个无连接协议,使用这种协议时,需要在两台计算机之间建立固定的连接, 也就是说, 通信双方没有服务器和客户机之分,它们之间进行的是对等通信, 所以它的优势很明显, 是现代通信不可或缺的一部分。所以,利用它的优势设计一个可以实现私聊和群聊的软件,实现两台计算机间的即时通讯。2、 课程设计要求基于 UDP 协议实现一对一的聊天的聊天,提供友好的用户界面,便于用户进行操作。根据目前使用聊天程序的用户需求显示,用户对于聊天程序主要有以下几点要求:(1)聊天功能:可以实现实时接收和发送文字信息,并能支持公聊和私聊的方式。(2)用户功能:可以查看对方的开放信息,以及发送方的IP 四、系统实现名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 17 页 - - - - - - - - - 6 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,输入内容点击放松就可以接收了。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 17 页 - - - - - - - - - 7 五、 设计过程实现代码如下:主机 A 的代码:package qq; import java.awt.*; import java.awt.event.*; import java.io.IOException; import .*; 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();/窗体使用边界布局管理器名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 17 页 - - - - - - - - - 8 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 byte1024; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 17 页 - - - - - - - - - 9 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(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 17 页 - - - - - - - - - 10 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); 运行后的对话框名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 17 页 - - - - - - - - - 11 主机 B 的代码:package qq; import java.awt.*; import java.awt.event.*; import java.io.IOException; import .*; 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;/滚动条名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 17 页 - - - - - - - - - 12 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 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 17 页 - - - - - - - - - 13 socket=new DatagramSocket(9527);/ 实例化数据报套接字byte buf=new byte1024; 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(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 17 页 - - - - - - - - - 14 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); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 17 页 - - - - - - - - - 15 运行后的界面实现对话后,主机A 的显示:主机 B 的显示:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 17 页 - - - - - - - - - 16 2、调试分析与过程总结1 遇到的问题和解决方法:在创建窗体时,由于对有些控件不了解,所以在应用时,查找了一些相关资料,学会了如何添加和使用。其中有段程序是选择现有文件夹里的ico 图标,但是由于没有把图片放在指定的地方,所以在运行时, 总是提示找不到指定的文件。这个程序中功能是选择要聊天的任何一个IP 可以进行聊天,但因我的能力有限,不能搭建如多人群聊,群众私聊等功能。在运行时需将ip 地址改成对方主机ip,所以显示出了此程序的另一个不足,在运行时比较麻烦,我试图改进过此程序,但都以失败告终,此课程设计让我充分认识到了自己的不足,我今后会更加努力,完成属于自己的多功能聊天程序。2 心得体会这个程序中功能是选择要聊天的任何一个IP 可以进行聊天, 但因我的能力有限,不能搭建如多人群聊,群众私聊等功能。在运行时需将ip 地址改成对方主机ip,所以显示出了此程序的另一个不足,在运行时比较麻烦,我试图改进过此程序,但都以失败告终,此课程设计让我充分认识到了自己的不足,我今后会更加努力,完成属于自己的多功能聊天程序。结论通过这次课程设计, 使我对网络编程和eclipse有了更进一步的认识和了解,也让我学会了 java 和 eclipse基本操作的一些知识。要想学好网络编程要重在实名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 17 页 - - - - - - - - - 17 践,必须通过不断的实践操作才能更好地掌握它。我也发现我的好多不足之处,首先是自己在基础上还不行,经常出错,通过学习已有所改进;再有对java 的一些类不太了解,还有对函数调用的正确使用不够熟悉,还有对eclipse 中经常出现的错误也不了解,通过实践的学习,我认识到学好计算机要重视实践操作,不仅仅是学习java 语言,还是其它的语言和学科,以及其它的计算机方面的知识都要重在实践, 所以后在学习过程中, 我会更加注视实践操作, 使自己更好地学好计算机。参考文献1 耿祥义 编著java 课程设计清华大学出版社2004版2 Y .Daniel Liang 著java 语言程序设计机械工业出版社名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 17 页 - - - - - - - - -