基于UDP协议的局域网即时通信软件设计.docx_第1页
基于UDP协议的局域网即时通信软件设计.docx_第2页
基于UDP协议的局域网即时通信软件设计.docx_第3页
基于UDP协议的局域网即时通信软件设计.docx_第4页
基于UDP协议的局域网即时通信软件设计.docx_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于UDP协议的局域网即时通信软件设计 指导老师:学 生: 学 号:12017年5月2日主要内容一、局域网即时通信软件简介二、软件架构三、运行结果及分析四、实验总结五、文献引用及网站六、源代码1、 局域网即时通信软件简介1局域网通讯(Local Network,简称LNLNIM)是指能够即时发送和接收互联网消息等的业务。自2001年面世以来,特别是近几年的迅速发展,局域网通讯功能日益丰富,逐渐集成了电子邮件、博客、音乐、电视、游戏和搜索等多种功能。它不再是一个单纯的聊天工具,已经发展成集交流、资讯、娱乐、搜索、电子商务、办公协作和企业客户服务等为一体的综合化信息平台。是一种终端连往即时通讯网络的服务。它不同于e-mail在于它的交谈是即时的。大部分的即时通讯服务提供了状态信息的特性显示联络人名单,联络人是否在在线与能否与联络人交谈。LNIM最早的创始人是三个以色列青年,是他们在2001年做出来的,取名叫FreeEIM。2002年当FreeEIM注册用户数达到12万时,目前飞鸽传书FreeEIM有13万多用户,主要市场在美洲和欧洲,已成为世界上最大的局域网通讯系统。在早期的局域网通讯程式中,使用者输入的每一个字元都会即时显示在双方的萤幕,且每一个字元的删除与修改都会即时的反应在萤幕上。这种模式比起使用e-mail更像是电话交谈。在现在的即时通讯程式中,交谈中的另一方通常只会在本地端按下送出键(Enter或是Ctrl+Enter)後才会看到讯息。1998年代早期,一种更早的局域网通讯形式是柏拉图系统(PLATO system)。在FreeEIM的介绍之後,同时在许多地方有一定数量的局域网通讯方式发展,且各式的局域网通讯程式有独立的协定,无法彼此互通。这引导使用者同时执行两个以上的局域网通讯软体,或者他们可以使用支援多协定的终端软体,如GaLNIM、Trillian或Jabber。近年来,许多局域网通讯服务开始提供视讯会议的功能,网络电话(VoIP),与网路会议服务开始整合为兼有影像会议与即时讯息的功能。於是,这些媒体的分别变的越来越模糊。本文主要呈现一个实现局域网基于UDP协议的P2P模式的即时通信软件原型。2、 软件架构本即时通信软件基于P2P模式,不需要服务器的支持。用JAVA语言编写,平台无关性好。传输层协议为UDP,应用层协议自行设计,协议设计可靠性高、开销小。主要由Main、ChatWindow、User、Protocol、Communication、DataParse等类或模块组成,利用多线程技术、GUI及事件驱动编程。模块间耦合性低,内聚性强,可扩展性好,符合软件设计原则。部分功能限于时间因素,未能实现。各模块主要功能:Main主要实现通信软件主窗口UI和相关逻辑,显示本地用户信息、本局域网在线联系人列表以及局域网搜索联系人、发起通信、退出等功能。ChatWindow主要实现聊天窗口UI和相关逻辑,由对方联系人信息、聊天内容呈现窗口、聊天文本输入等部分组成。User定义联系人的基本属性、主机相关信息(IP地址和端口)以及相关修改策略。Protocol主要实现本软件的应用层协议,包括联系人搜索请求及应答、文本信息传送、视频数据传送(未实现)、文件传送(未实现)等关键字,实现了应用层协议拆分、初步解析等功能。Communication实现基于UDP协议的数据接收和发送,为其他组件提供Write和Read方法。DataParse主要实现协议的完整解析。软件架构:实例化Main主窗口User昵称、性别、年龄、IP等信息修改数据投送数据投送数据投送联系人搜索其他用户合作解析Protocol定义应用层协议信息呈现实例化ChatWindow聊天主窗口Communication实现数据接收与发送DataParse完整解析接收的数据3、 运行结果及分析本软件在实际使用中(非单机测试)使用端口8888,为便于单机测试,两终端收发端口分别各位7777和8888。一、主窗口主窗口由菜单栏Option、用户信息显示、联系人列表、搜索(Refresh)、发起通信(Chat)、退出(Quit)等部分组成。在测试中分别为随机生成的默认昵称User1646和User727,在相互搜索之后,各自列表中会显示本局域网在线联系人。Option中包括修改本地用户信息、端口等内容。2、 聊天窗口在选定列表中某联系人后,点击Chat将创建一个通信实例。下面是User1646和User727的测试通信结果。 测试结果表明结果符合预期,且资源占用少,运行稳定性好。4、 实验总结 用JAVA进行应用层编程非常方便,而且易用性很强。本软件虽然功能简单,但充分利用了Swing的快捷可靠的GUI设计、JAVA支持的多线程技术和UDP协议接口,实现了局域网即时通信软件的核心功能。限于时间因素,如文件传送、视频聊天等功能没有去实现,但软件的可扩展性良好(协议解析、数据接口等),为以后的功能扩展奠定了良好基础。大二初曾写过一个基于C/S模式的即时通信软件,实现了客户端和服务器端,总代码量1600行,实现了添加好友、发起聊天等核心功能,也用到了JDBC桥接MySQL数据库等内容。现在再写此类程序则得心应手。5、 引用文献及网站1搜狗百科;局域网即时通信软件简介2百度知道;JAVA基础相关6、 源程序Mainpackage mychat;import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .SocketException;import java.util.ArrayList;import javax.swing.DefaultListModel;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JList;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.text.html.HTMLDocument.Iterator;public class Main extends JFrame implements ActionListenerCommunication cmu=null;static User usr=null;User friends=null;int maxfriendnum;int currentnum=0;JLabel name=null;JLabel gender=null;JLabel age=null;JLabel host=null;JPanel pane=null;JTextField tname=null;JTextField tgender=null;JTextField tage=null;JTextField thost=null;JScrollPane spane=null;JButton chat=null;JButton refresh=null;JButton quit=null;JList sublist=null;ArrayList fnditem=null;DefaultListModel model=null;void inforinit()cmu.setUser(usr);tname.setText();tgender.setText(usr.gender);tage.setText(String.valueOf(usr.age);thost.setText(usr.ip);public void setPane()model.clear();java.util.Iterator i=fnditem.iterator();while(i.hasNext()model.addElement(i.next();public Main()model=new DefaultListModel();sublist=new JList(model);fnditem=new ArrayList();maxfriendnum=255;friends=new Usermaxfriendnum;JMenuItem mport=new JMenuItem(Change Port);JMenuItem mname=new JMenuItem(Modify Name);JMenuItem mage=new JMenuItem(Modify Age);JMenuItem mgender=new JMenuItem(Modify Gender);JMenuItem mscan=new JMenuItem(Port Scan);JMenu menu=new JMenu(Option);menu.add(mport);menu.add(mname);menu.add(mage);menu.add(mgender);menu.add(mscan);JMenuBar menubar=new JMenuBar();menubar.add(menu);this.setJMenuBar(menubar);usr=new User();cmu=new Communication(usr,this);cmu.init();cmu.start();pane=new JPanel();pane.setLayout(null);name=new JLabel(Name :);gender=new JLabel(Gender :);age=new JLabel(Age :);host=new JLabel(Ip :);tname=new JTextField();tgender=new JTextField();tage=new JTextField();thost=new JTextField();name.setBounds(10, 10, 40, 20);tname.setBounds(60, 10, 210,20);age.setBounds(10, 40, 30, 20);tage.setBounds(60, 40, 40, 20);gender.setBounds(150,40,50,20);tgender.setBounds(220, 40, 50, 20);host.setBounds(10,70,40,20);thost.setBounds(60, 70, 210, 20);pane.add(name);pane.add(tname);pane.add(age);pane.add(tage);pane.add(gender);pane.add(tgender);pane.add(thost);pane.add(host);inforinit();spane=new JScrollPane(sublist);spane.setBounds(20,100,250,450);chat=new JButton(Chat);chat.setBounds(20,560,70,30);chat.addActionListener(this);refresh=new JButton(Refresh);refresh.setBounds(100,560,90,30);this.add(refresh);refresh.addActionListener(this);quit=new JButton(Quit);quit.setBounds(200, 560, 70, 30);quit.addActionListener(this);pane.add(quit);pane.add(chat);this.add(spane);this.add(pane);this.setTitle(SineQ);this.setSize(300,650);this.setVisible(true);this.setLocation(900, 50);this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.setResizable(false);public void searchfriend()User temp=new User();temp.ip=55;temp.port=8888;cmu.send(String.valueOf(usr.port)+-+Protocol.segment.search+-).getBytes(), temp);Overridepublic void actionPerformed(ActionEvent arg0) / TODO Auto-generated method stubObject src=arg0.getSource();if(src=chat)int index=sublist.getSelectedIndex();if(index!=-1)if(friendsindex!=null)if(friendsindex.chatwnd=null)friendsindex.chatwnd=new Chatwindow(friendsindex,cmu);else if(src=refresh)for(int j=0;jmaxfriendnum;j+)if(friendsj!=null)if(friendsj.chatwnd!=null)friendsj.chatwnd.dispose();friendsj=null;currentnum=0;fnditem.clear();inforinit();searchfriend();else if(src=quit)for(int j=0;jmaxfriendnum;j+)if(friendsj!=null)if(friendsj.chatwnd!=null)friendsj.chatwnd.dispose();friendsj=null;this.dispose();cmu.quit();public static void main(Stringargs)Main main=new Main();User:package mychat;import .InetAddress;import .UnknownHostException;public class User public String name=null;public String ip=null;public String gender=null;public int age;public int port;public Chatwindow chatwnd=null;public User()name=user+Math.round(Math.random()*2555);try ip=InetAddress.getLocalHost().getHostAddress(); catch (UnknownHostException e) / TODO Auto-generated catch blocke.printStackTrace();gender=male;age=21;port=7777;DataParse:package mychat;import .DatagramPacket;import java.util.ArrayList;import java.util.Date;import java.util.Iterator;public class Dataparse Communication cmu=null;Iterator i=null;Date date=null;public Dataparse(Communication cmu)date=new Date();this.cmu=cmu;public void parse(DatagramPacket data)ArrayList temp=Protocol.strbreak(new String(data.getData();User usr=new User();usr.ip=data.getAddress().getHostAddress(); i=temp.iterator(); if(i.hasNext() usr.port=Integer.valueOf(i.next();while(i.hasNext()String te=i.next();System.out.println(+te);if(te.equals(Protocol.segment.search)deal_search(usr);else if(te.equals(Protocol.segment.message)deal_message(usr);else if(te.equals(Protocol.segment.file)deal_file();else if(te.equals(Protocol.segment.echosearch)deal_echosearch();private void deal_search(User usr) / TODO Auto-generated method stubif(usr.port=cmu.main.usr.port)return;String temp=String.valueOf(cmu.main.usr.port)+-+Protocol.segment.echosearch;temp+=-;temp+=;temp+=-;temp+=cmu.host.gender;temp+=-;temp+=String.valueOf(cmu.host.age);temp+=-;temp+=String.valueOf(cmu.host.port);temp+=-;temp+=cmu.host.ip;temp+=-;cmu.send(temp.getBytes(), usr);private void deal_file() / TODO Auto-generated method stubprivate void deal_message(User usr) / TODO Auto-generated method stubString temp=i.next();boolean flag=false;int index=cmu.main.currentnum;for(int j=0;jindex;j+)if(usr.ip.equals(cmu.main.friendsj.ip)flag=true;if(cmu.main.friendsj.chatwnd=null)cmu.main.friendsj.chatwnd=new Chatwindow(cmu.main.friendsj, cmu);cmu.main.friendsj.chatwnd.receivewnd.append(date.toString()+:n+temp+n);private synchronized void deal_echosearch() / TODO Auto-generated method stubUser usr=new User();if(i.hasNext()=i.next();if(i.hasNext()usr.gender=i.next();if(i.hasNext()usr.age=Integer.parseInt(i.next();if(i.hasNext()usr.port=Integer.parseInt(i.next();if(i.hasNext()usr.ip=i.next();int index=cmu.main.currentnum;boolean flag=false;for(int j=0;jindex;j+)if(usr.ip.equals(cmu.main.friendsj.ip)flag=true;if(flag=false)cmu.main.friendsindex=usr;cmu.main.currentnum+;cmu.main.fnditem.add();cmu.main.setPane();Protocol:package mychat;import java.util.ArrayList;public class Protocol static class segmentpublic static String message=message;public static String search=search;public static String echosearch=echosearch;public static String file=file;public static String font=font;public static String video=video;public static ArrayList strbreak(String str)ArrayList temp=new ArrayList();while(str.indexOf(-)!=-1)temp.add(str.substring(0, str.indexOf(-);if(str.indexOf(-)!=str.length()-1)str=str.substring(str.indexOf(-)+1,str.length()-1);else break;return temp;ChatWindow:package mychat;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Date;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class Chatwindow extends JFrame implements ActionListenerDate date=null;User usr=null;Communication cmu=null;JLabel name=null;JLabel gender=null;JLabel age=null;JLabel host=null;JPanel pane=null;JTextField tname=null;JTextField tgender=null;JTextField tage=null;JTextField thost=null;JTextArea receivewnd=null;JTextArea sendwnd=null;JButton send=null;JButton quit=null;JScrollPane spaner=null;JScrollPane spanes=null;void inforinit()tname.setText();tgender.setText(usr.gender);tage.setText(String.valueOf(usr.age);thost.setText(usr.ip);public Chatwindow(User usr,Communication cmu)this.usr=usr;this.cmu=cmu;date=new Date();pane=new JPanel();name=new JLabel(Name :);gender=new JLabel(Gender :);age=new JLabel(Age :);host=new JLabel(Ip :);pane.setLayout(null);tname=new JTextField();tgender=new JTextField();tage=new JTextField();thost=new JTextField();name.setBounds(10, 10, 40, 20);tname.setBounds(60, 10, 210,20);age.setBounds(10, 40, 30, 20);tage.setBounds(60, 40, 40, 20);gender.setBounds(150,40,50,20);tgender.setBounds(220, 40, 50, 20);host.setBounds(320,10,40,20);thost.setBounds(350, 10, 210, 20);pane.add(name);pane.add(tname);pane.add(age);pane.add(tage);pane.add(gender);pane.add(tgender);pane.add(thost);pane.add(host);inforinit();this.add(pane);receivewnd=new JTextArea();sendwnd=new JTextArea();spaner=new JScrollPane(receivewnd);spanes=new JScrollPane(sendwnd);spaner.setBounds(10,80,400,180);spanes.setBounds(10,270,400,120);pane.add(spaner);pane.add(spanes);send=new JButton(Send);quit=new JButton(Quit);send.setBounds(340,400,70,30);quit.setBounds(260,400,70,30);send.addActionListener(this);quit.addActionListener(this);pane.add(send);pane.add(quit);this.setSize(600,500);this.setLocation(200,100);this.setTitle(Chating with +);this.setVisible(true);this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);Overridepublic void actionPerformed(ActionEvent arg0) / TODO Auto-generated method stubObject src=arg0.getSource();if(src=send)String temp=String.valueOf(cmu.main.usr.port)+-+Protocol.segment.message+-;temp+=sendwnd.getText()+-;cmu.send(temp.getBytes(), usr);receivewnd.append(Me: +date.toString()+:n+sendwnd.getText()+n);sendwnd.setText();Communication:package mychat;import java.io.IOException;import .DatagramPacket

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论