欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    [互联网]TCPIP协议分析课程设计任务书beta.doc

    • 资源ID:4662755       资源大小:1.12MB        全文页数:39页
    • 资源格式: DOC        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    [互联网]TCPIP协议分析课程设计任务书beta.doc

    TCP/IP协议分析课程设计任务书及指导书武汉工业学院 数学与计算机学院2012-12-1836目录目录2课程设计课题内容4课题内容设计思路4客户端:4界面设计分析:4框架设计分析6服务器:8服务器功能分析8框架设计分析:9源代码10通信子系统源代码:10ChatClient.java10ChatClientHandler.java14ChatServer.java17ChatServerHandler.java19ChatProtocolImpl.java22ChatProtocolStruct.java29CmdType.java32通信子系统测试源代码:33UserLoginWnd.java33ChatClientGUI.java38WndShow.java48类分布结构51m包:51chatsystem.gui包:51chatsystem.util51测试环境描述:51测试说明:51“连接服务器”按钮:52“退出”按钮:52其他控件:53测试结果截图:53课程设计要求:53主要工作:53课程设计报告撰写要求:53设计思路和实现方法:54程序运行测试截图54课程设计总结54封面模板55课程设计课题内容设计并开发出一个简单的即时通讯系统,包括通讯客户端和服务器。客户端采用GUI模式进行设计,而服务器端采用后台方式工作。客户端功能:n 注册新用户n 登录服务器;n 显示当前服务器在线用户;n 群聊;n 私聊;服务器功能:n 创建新用户;n 验证客户端登录;n 实现客户端消息的转发;课题内容设计思路客户端:界面设计分析:用户登录窗口UserLoginWnd接收数据:用户名、密码数据来源:用户输入业务处理:1. 向服务器发送登录请求,送出用户名和密码;2. 接收服务器反馈,成功则进入客户端主窗口;3. 打开注册新用户窗口;用户注册窗口UserRegisterWnd接收数据:用户名、密码、密码确认数据来源:用户输入业务处理:1. 判断密码和密码确认是否一致;2. 向服务器发送注册新用户请求,送出用户名和密码;3. 接收服务器反馈,成功则回到用户登录窗口;客户端主窗口MainChatWnd接收数据:用户列表信息、当前用户将发送消息;服务器转发某用户的群发消息;数据来源:网络传输、用户输入业务处理:1. 接收服务器发来的已登录用户信息,刷新Tree控件;2. 接收服务器转发来的群聊消息,追加消息到文本框中;3. 将当前用户输入的消息发送给服务器;4. 当前用户双击Tree控件中的对应某个用户的节点时,打开私聊窗口私聊窗口PersonChatWnd接收数据:正在私聊的用户信息;服务器转发来的文本消息;当前用户输入的消息数据来源:网络传输、用户输入业务处理:1. 接收服务器转发来的私聊消息;2. 将当前用户输入的文本信息发送给服务器;通过界面设计分析后,应该大概清楚本系统的客户端应具备哪些功能了。下面开始进行系统设计的实质性分析,也就是框架设计。这里我们采用分层的模式进行设计。大概应该分哪几层呢?框架设计分析显示层:包括客户端的窗口类;UserLoginWnd.java实现用户登录窗口布局UserRegisterWnd.java实现用户注册窗口布局MainChatWnd.java实现系统主窗口布局UsersTree.java实现系统主窗口中用户树PresonChatWnd.java实现私聊窗口布局业务层包括客户端窗口类处理的业务逻辑实现类;UserLoginLogic.java实现用户登录的业务逻辑UserRegisterLogic.java实现用户注册的业务逻辑GetLoginedUsersLogic.java实现获取已登录用户信息的业务逻辑MessagesHandlerLogic.java实现接收和发送消息要处理的业务逻辑通信层包括客户端与服务器通信协议的实现类;ChatProtocolImpl.java实现本系统应用层协议ChatClient.java实现与服务器的通信综合分析后得到各个类之间的静态关系图如下所示。图中带箭头的虚线表示虚线尾连接的对象会调用箭头指向的对象。对于上面类静态图,这里进行一个简要的解释。n 本系统客户端启动时,将创建UserLoginWnd对象,用于打开“登录窗口”,并等待用户的操作。如果用户点击了“登录”按钮,就要调用UserLoginLogic,对用户输入的用户名和密码进行检查,如果一切正常,那么调用ChatClient将用户名和密码发送给服务器,并等待服务器的回馈信息,如果成功登录,则UserLoginLogic返回true给UserLoginWnd对象,登录窗口退出,并通知ChatSystemClient对象,登录服务器成功,进而调用MainChatWnd对象,以显示系统主窗口。n 主窗口中有一棵显示已登录用户的树,要创建这棵树需要获取已登录用户的信息,MainChatWnd类将UsersTree对象作为其私有成员,UsersTree中可能有一个CreateTree的方法,用来创建该树,不过首先要调用GetLoginedUsersLogic对象获取已登录用户的信息,该信息需要从服务器端获取,因此要调用ChatClient向服务器发出获取已登录用户信息的通信请求,获得信息后,以供CreateTree方法创建用户信息树。n 在主窗口中,当用户需要发送一条群发消息时,需要调用MessagesHandlerLogic对象,组织好要发送的消息,以及发送地址等一切发送准备工作,然后调用ChatClient对象,将消息发送给服务器;当服务器转发消息到来时,MessagesHandlerLogic对象将接收到的消息进行处理并格式化输出到主窗口的接收信息文本框中。n 在主窗口中,当用户点击用户树上的某个节点时,会打开PersonChatWnd对应的窗口,本地用户可以通过该窗口与对应用户树的那个节点关联的远端用户进行私聊。n ChatProtocolImpl类负责实现本系统的应用层通信协议,完成构造要发送的协议命令或对接收到的协议命令进行处理。u 登录验证:命令类型、本地用户名、密码u 登录验证返馈:命令类型、操作结果u 注册新用户:命令类型、本地用户名、密码u 注册用户返馈:命令类型、操作结果u 发送群消息:命令类型、本地用户名、消息、时间u 获取用户列表:命令类型u 用户列表返馈:命令类型 用户名列表u 发送私聊消息:命令类型、本地用户名、消息、远程用户名、时间协议数据包结构:class ChatProtocolStruct implements Serializablebyte cmdType;String localName;String password;String msg;String peerName;byte result;Time sendTime;Array userList;n ChatClient类负责进行实际网络通信传输。服务器:服务器采用控制台模式设计,因此没有界面设计的问题。服务器功能分析登录验证;创建新用户;转发消息;框架设计分析:以上是从整体上对本课程设计计划设计并开发的即时通讯系统的一个大致描述。在设计过程中可以参考以上设计思路,但也需要根据实际情况进行调整。从本质上讲,即时通讯系统很大程度上就是设计底层的通信子系统,通信子系统设计好之后,不管前端用户界面是什么,都可以进行简单调整后,实现不同用户界面的通信。源代码基于Apache的mina架构设计的本课程设计课题的通信子系统的源代码。通信子系统源代码:ChatClient.java实现客户端连接、发送、和关闭等package m;import .InetAddress;import .InetSocketAddress;import javax.swing.JPanel;import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;import org.apache.mina.core.future.CloseFuture;import org.apache.mina.core.future.ConnectFuture;import org.apache.mina.core.session.IoSession;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;import org.apache.mina.filter.logging.LogLevel;import org.apache.mina.filter.logging.LoggingFilter;import org.apache.mina.transport.socket.SocketConnector;import org.apache.mina.transport.socket.nio.NioSocketConnector;import chatsystem.util.ChatProtocolStruct;public class ChatClient private SocketConnector connector;private ConnectFuture future;private IoSession session;private InetAddress serverIP;private int ServerPort;private JPanel panel; private boolean connected;public ChatClient()public ChatClient(JPanel panel)this.panel = panel; /主要用于回调,当消息来后,反馈给需要的窗口界面 connected = false; public boolean connect()connector = new NioSocketConnector();connector.setConnectTimeoutMillis(3000);DefaultIoFilterChainBuilder filterChain = connector.getFilterChain();filterChain.addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory();connector.setHandler(new ChatClientHandler(panel);ConnectFuture future = connector.connect(new InetSocketAddress(serverIP,ServerPort);future.awaitUninterruptibly();session = future.getSession(); connected = true;return true;public void send(ChatProtocolStruct paramCps)session.write(paramCps); public boolean isConnected() return connected; public boolean close()CloseFuture future = session.getCloseFuture();future.awaitUninterruptibly(1000);connector.dispose(); connected = false;return true;public InetAddress getServerIP() return serverIP;public void setServerIP(InetAddress serverIP) this.serverIP = serverIP;public int getServerPort() return ServerPort;public void setServerPort(int serverPort) ServerPort = serverPort;public SocketConnector getConnector() return connector;public ConnectFuture getFuture() return future;public IoSession getSession() return session;ChatClientHandler.java主要用于处理接收数据。package m;import chatsystem.gui.ChatClientGUI;import chatsystem.gui.UserLoginWnd;import chatsystem.util.ChatProtocolStruct;import chatsystem.util.CmdType;import java.text.SimpleDateFormat;import javax.swing.JPanel;import org.apache.log4j.Logger;import org.apache.mina.core.service.IoHandler;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.core.session.IoSession;public class ChatClientHandler extends IoHandlerAdapter implements IoHandler private JPanel panel; /用于回调,将接收到的消息反馈给其指代的窗口 public ChatClientHandler() public ChatClientHandler(JPanel panel) this.panel = panel; public void setPanel(JPanel panel) this.panel = panel; Overridepublic void exceptionCaught(IoSession session, Throwable cause)throws Exception / TODO Auto-generated method stubsuper.exceptionCaught(session, cause);Overridepublic void messageReceived(IoSession session, Object message)throws Exception / TODO Auto-generated method stubsuper.messageReceived(session, message);ChatProtocolStruct cps = (ChatProtocolStruct)message; /如果到来的命令是用户认证应答命令if(cps.getCmdType() = CmdType.VERIFY_ACK.getIndex()UserLoginWnd ulw = null;if(cps.getResult() = 1)if(panel!= null )ulw = (UserLoginWnd)panel;ulw.VerifyResult(1);System.out.println("登录成功");else if(cps.getResult() = -1)if(panel!= null )ulw = (UserLoginWnd)panel;ulw.VerifyResult(-1);System.out.println("登录失败");/如果是服务器转发消息命令包if(cps.getCmdType() = CmdType.FORWORD_MSG.getIndex() System.out.println("接收一条转发消息!");SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); String str = formatter.format(cps.getSendTime();ChatClientGUI ccg = null; /如果命令包中,目的地址显示为”ALL”,即群聊消息转发if(cps.getDName().equals("ALL")if(panel!= null) ccg= (ChatClientGUI)panel;String msg = String.format("%s(群聊):%s",cps.getSName(),str);ccg.showMsg(msg);System.out.printf("%s(群聊):%s",cps.getSName(),str);ccg.showMsg(cps.getMsg();else/否则是私聊信息的转发if(panel!= null)ccg= (ChatClientGUI)panel;/这里需要根据实际情况,强制转换为私聊窗口对应的类对象。String msg = String.format("%s(私聊):%s",cps.getSName(),str);ccg.showMsg(msg);System.out.printf("%s(私聊):%s",cps.getSName(),str);ccg.showMsg(cps.getMsg();/TODO: 根据实际需要,添加更多的协议包处理代码System.out.println();System.out.println(cps.getMsg();ChatServer.java实现服务器启动package m;import java.io.IOException;import .InetSocketAddress;import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;import org.apache.mina.transport.socket.SocketAcceptor;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;public class ChatServer private static final int PORT = 5678; private SocketAcceptor acceptor; public ChatServer() acceptor = new NioSocketAcceptor(); public boolean start() DefaultIoFilterChainBuilder filterChain = acceptor.getFilterChain(); / 添加编码过滤器 处理乱码、编码问题 filterChain.addLast("mycodec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory(); / 设置核心消息业务处理器 acceptor.setHandler(new ChatServerHandler(); / 设置session配置,30秒内无操作进入空闲状态 /acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 300); try acceptor.bind(new InetSocketAddress(PORT); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace(); return true; public static void main(String args) ChatServer server = new ChatServer(); server.start(); ChatServerHandler.java实现服务器对于接收的客户端请求的处理和响应。package m;import chatsystem.util.ChatProtocolImpl;import chatsystem.util.ChatProtocolStruct;import chatsystem.util.CmdType;import java.util.Collection;import org.apache.mina.core.service.IoHandler;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IoSession;public class ChatServerHandler extends IoHandlerAdapter implements IoHandler Overridepublic void exceptionCaught(IoSession session, Throwable cause)throws Exception / TODO Auto-generated method stubOverridepublic void messageReceived(IoSession session, Object message)throws Exception / TODO Auto-generated method stubString key = ""ChatProtocolStruct cps = (ChatProtocolStruct)message;ChatProtocolImpl cpi = new ChatProtocolImpl();/处理接收到的认证请求,发送处理结果if(cps.getCmdType() = CmdType.VERIFY_REQ.getIndex() System.out.println("接收一条认证消息!");session.write(cpi.createVerifyAck(cps);session.setAttribute(cps.getSName();/处理接收到的私聊消息,并转发给特定用户if(cps.getCmdType() = CmdType.PERSONCHAT_MSG.getIndex()Collection<IoSession> sessions = session.getService().getManagedSessions().values();for(IoSession s:sessions)if(s.getAttribute(key) = cps.getDName()s.write(cpi.createForwardMsg(cps);break;/处理群聊消息,并转发给所有连接到服务器的用户if(cps.getCmdType() = CmdType.GROUPCHAT_MSG.getIndex() System.out.println("接收一条群聊消息!");Collection<IoSession> sessions = session.getService().getManagedSessions().values();for(IoSession s:sessions)s.write(cpi.createForwardMsg(cps);Overridepublic void messageSent(IoSession session, Object message) throws Exception / TODO Auto-generated method stub System.out.println(session.getRemoteAddress().toString()+ " 发送一条消息!");Overridepublic void sessionClosed(IoSession session) throws Exception / TODO Auto-generated method stub System.out.println("连接:" + session.getRemoteAddress().toString() + " 已关闭!");Overridepublic void sessionCreated(IoSession session) throws Exception / TODO Auto-generated method stub System.out.println("新连接:" + session.getRemoteAddress().toString();ChatProtocolImpl.java主要用于构造需要发送的特定命令的协议包package chatsystem.util;import java.util.ArrayList;import java.util.Date;public class ChatProtocolImpl /*用户认证 * param name * param passwd * return */private boolean userVerify(String name,String passwd)/这里只是测试代码,需要根据实际数据源添加相应代码,验证用户。 if(passwd.equals("123456")return true;elsereturn false;/*用户注册 * param name * param passwd * return */private boolean appendUserInof(String name,String passwd)/未实现。需要根据保存数据的数据源,写相应代码创建新用户。 return false; /*获取用户列表 * return */private ArrayList<String> getLoginedUsers() /未实现。需要根据保存数据的数据源,写相应代码完成userList的填充工作ArrayList<String> userList = new ArrayList<String>();return userList;/*构造认证确认包 * param paramCps * return */public ChatProtocolStruct createVerifyAck(ChatProtocolStruct paramCps)ChatProtocolStruct cps = new ChatProtocolStruct();if(userVerify(paramCps.getSName(),paramCps.getPassword()cps.setCmdType(byte)CmdType.VERIFY_ACK.getIndex();cps.setResult(byte)1);elsecps.setCmdType(byte)CmdType.VERIFY_ACK.getIndex();cps.setResult(byte)-1);return cps;/*构造注册确认包 * param paramCps * return */public ChatProtocolStruct createRegisterAck(ChatProtocolStruct paramCps)ChatProtocolStruct cps = new ChatProtocolStruct();if(userVerify(paramCps.getSName(),paramCps.getPassword()cps.setCmdType(byte)CmdType.REGISTER_ACK.getIndex();cps.setResult(byte)-1);elsecps.setCmdType(byte)CmdType.REGISTER_ACK.getIndex();cps.setResult(byte)1);return cps;/*构造转发消息包 * param paramCps * return */public ChatProtocolStruct createForwardMsg(ChatProtocolStruct paramCps)ChatProtocolStruct cps = new ChatProtocolStruct();cps.setCmdType(byte)CmdType.FORWORD_MSG.getIndex();cps.setDName(paramCps.getDName();cps.setSName(paramCps.getSName();cps.setMsg(paramCps.getMsg();cps.setSendTime(paramCps.getSendTime();return cps;

    注意事项

    本文([互联网]TCPIP协议分析课程设计任务书beta.doc)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开