基于UDP通信的聊天程序JAVA程序设计 课程设计报告.doc
《基于UDP通信的聊天程序JAVA程序设计 课程设计报告.doc》由会员分享,可在线阅读,更多相关《基于UDP通信的聊天程序JAVA程序设计 课程设计报告.doc(18页珍藏版)》请在沃文网上搜索。
1、 基于UDP通信的聊天程序1 协议介绍和使用说明1.1 协议内容本课程设计主要是基于UDP的并用Java实现的简单的聊天程序。UDP 用户数据报是在运输层的端到端抽象的逻辑信道中传送的。UDP 在传送数据之前不需要先建立连接。对方的运输层在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 是一种最有效的工作方式。虽然UDP 用户数据报只能提供不可靠的交付,但 UDP 在某些方面有其特殊的优点,它有即时通信的功能。比如说,使用聊天程序聊天的时候,省去的了跟对方通信的时候的链接的麻烦,直接进行通信。UDP 只在 IP 的数据报服务之上增加了很少一点的功
2、能,即端口的功能和差错检测的功能。UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制。UDP 是面向报文的。UDP 没有拥塞控制,很适合多媒体通信的要求。UDP 支持一对一、一对多、多对一和多对多的交互通信。发送方 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。接收方 UDP 对 IP 层交上来的 UDP 用户数据报,在去除首部后就原封不动地交付上层的应用进程,一次交付一个完整的报文。1.2 关键技术1.2.1 服
3、务器端Socket的实现Socket又称作套接字,它是使用标准Unix文件描述符(filedescriptor)和其它程序通讯的方式。使用send()和recv()让你更好的控制数据传输。在Java 网络编程中,socket相当于应用程序的港口码头;在计算机网络中,套接字由ip地址和端口号组成,为进程之间通信提供地址。两个主机进行通信实际上就是两个主机中的应用进程互相通信,应用进程之间的通信又称为端到端的通信。为应用进程之间的通信提供运输服务的是运输层的运输协议,运输层需要有两种不同的运输协议,即面向连接的TCP和无连接的UDP。 在Java中,用于实现基于UDP的聊天程序,使用两个重要的类(
4、DatagramSocket类和DatagramPacket类)。DatagramSocket类表示用来发送和接收数据报包的套接字。数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。 在DatagramSocket上总是启用UDP广播发送。为了接收广播包,应该将 DatagramSocket绑定到通配符地址。在某些实现中,将DatagramSocket绑定到一个更加具体的地址时广播包也可以被接收。atagramPacket类表示数据报包。 数据报包用来实现无连接包投递服务
5、。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。服务程序工作在服务器的某个端口上,一旦启动服务,它将在这个端口上监听,等待客户程序发来请求,当有客户连接到该端口,accept()方法就返回一个Socket对象,可以用该对象获得一个输入输出流。服务器的套接字用服务器套接字类(ServerSocket)来建立。具体实现如下:(1)建立一个服务者,端口为5000。(2)服务者永远等待,一旦客户送来正确的请求,连接至该端口,accept()方法就返回一个Socket对象。(3)用返回的Sock
6、et对象创建数据输入流类的实例in。用返回的Socket对象创建数据输出流的实例out。以上实例in和out是服务者用于从客户接受输入信息和向客户程序发送信息所用。此外,还需要用方法readline()和println()读取或输出一行数据。(4)soc.close()关闭Socket。1.2.2 通信的建立在客户端建立Socket对象,并进行异常处理,主机名和端口号与连接的服务器名和提供该服务的服务程序的监听端口必须一致。建立连接后用Socket类提供的getInputStream()和getOutputStream()方法取得输入输出流。在服务器端,获得的输入流是客户端的输出流,而Sock
7、et获得的输出流是发向客户端的输入流,在客户端也是这样。获得socket的输入输出流之后,为了便于读写操作,需要在这两个流对象基础上建立易于操作的数据流DateInputStream, DataOutputStream。然后对输入输出流进行读写操作。在通信结束时关闭socket,以断开连接,释放资源。先关闭对应的输入输出流,再关闭socket本身。1.2.2 数据库的建立mySQL数据库:2 程序设计2.1系统结构本系统采用一个服务器端和多个客户端的聊天方式来实现。结构图如下所示:图2.1服务器-客户端结构图2.2主程序设计2.2.1 服务器端程序 服务器与客户间通过套接口Socket连接。在
8、java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类.Socket.,使得编写网络应用程序相对容易服务器采用多线程以满足多用户的请求,程序用vector向量数组存储连接客户变量,通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为2012,然后无限循环调用accept()方法接受客户程序的连接。2.2.2 客户端程序 图2.2主程序流程图2.3 各模块设计2.3.1客户端向服务器发送消息 服务器与客户都通过DatagramSocket 以任意端口发送,DatagramPacket以2012端口来接收信息,信息从文本框输输入,一旦收到客户方的连接请
9、求,服务器accept()方法返回一个新建的Socket对象。客户端然后向服务器发送消息, 2.3.2客户端之间发送消息 客户间发送信息通过UDP来实现,用户登录时通过类DatagramPacket和DatagramSocket创建UDP包括其本地接受端口以及发送端口,默认端口为2012,通过取得的好友的IP地址来向好友发送消息(send(DatagramPacket)和接受消息(receive(DatagramPacket)。 2.4 界面设计2.4.1 界面设计的方法在Frame布局容器中,添加一个显示聊天的文本框(在上面),在加入Panel面板,Panel面板中包括三个TextField
10、单行文本框。 图2.3界面实现功能图2.4.2 界面的功能 界面中的组件有三个输入框,一个文本框,两个按钮。输入框要输入服务器的、用户名和要发送的聊天内容。文本框显示所以聊天人已经发送的聊天内容。按钮有连接按钮和发送按钮。服务器端只显示连接的建立、用户进入和退出、连接释放。2.5 实现代码实现通信的代码:package com.lcw.udp;import java.awt.Font;import java.awt.event.*;import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import
11、 java.io.IOException;import .*;import javax.swing.*;public class UDPNetChat extends JFrame implements Runnableprivate static final long serialVersionUID = 1L;JLabel lab,lab1,lab2;JTextField tx,tx1,tx2;JButton but,but1,but2;JTextArea txa;public UDPNetChat()this.setLayout(null);/=lab=new JLabel(本机IP);
12、lab.setBounds(10,0,60,30);this.add(lab);tx=new JTextField(,20);tx.setBounds(75, 0, 200, 30);String adStr;try InetAddress addr=InetAddress.getLocalHost();int index=addr.toString().indexOf(/);adStr=addr.toString().substring(index+1);tx.setText(adStr); catch (UnknownHostException e) e.printStackTrace()
13、;this.add(tx);lab1=new JLabel(对方IP);lab1.setBounds(10, 30, 60, 30);this.add(lab1);lab2=new JLabel(发言:);lab2.setBounds(10, 70, 60, 30);this.add(lab2);tx1=new JTextField(,20);tx1.setBounds(75, 30, 200, 30);/tx1.setText(172.16.92.79);this.add(tx1);tx2=new JTextField();tx2.setBounds(75, 70, 300, 30);thi
14、s.add(tx2);but=new JButton(发送);but.setBounds(380, 70, 80, 30);but.setMnemonic(KeyEvent.VK_ENTER);but.addMouseListener(new myMouseListener();this.add(but);txa=new JTextArea();Font font = new Font(宋体, Font.PLAIN, 14);txa.setFont(font);txa.setBounds(15, 110, 450, 300);this.add(txa);but1=new JButton(保存聊
15、天记录);but1.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e) try String fileName = JOptionPane.showInputDialog(输入保存的文件名及所在路径);File file = new File(fileName);BufferedWriter bw = new BufferedWriter(new FileWriter(file);bw.write(txa.getText().toString();bw.close(); catch (
16、Exception ce) ce.printStackTrace(););but1.setBounds(30,430,150,30);but2=new JButton(退出聊天);but2.setBounds(200, 430, 150, 30);/退出聊天but2.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e) dispose(););this.add(but1);this.add(but2);/=this.setTitle(基于UDP的网络聊天程序);this.setBound
17、s(100, 100, 480, 550);this.setVisible(true);public void run() /接收数据while(true)/持续接收本地端的信息byte buf=new byte100;/预期最多可收100个bytetryDatagramSocket DS=new DatagramSocket(2012);/用2222 port 收DatagramPacket DP=new DatagramPacket(buf,buf.length);/将数据收到buf数组DS.receive(DP);tx1.setText(DP.getAddress().getHostAd
18、dress();txa.append(来自+DP.getAddress().getHostAddress()+:+DP.getPort()+new String(buf).trim()+n); /此处用new String(DP.getData().trim()也一样DS.close();Thread.sleep(200);catch(InterruptedException e)catch(SocketException e)catch(IOException e)class myMouseListener extends MouseAdapter/送数据public void mouseC
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于UDP通信的聊天程序JAVA程序设计 课程设计报告 基于 UDP 通信 聊天 程序 JAVA 程序设计 课程设计 报告