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

上传人:sccc 文档编号:4662755 上传时间:2023-05-05 格式:DOC 页数:39 大小:1.12MB
返回 下载 相关 举报
[互联网]TCPIP协议分析课程设计任务书beta.doc_第1页
第1页 / 共39页
[互联网]TCPIP协议分析课程设计任务书beta.doc_第2页
第2页 / 共39页
[互联网]TCPIP协议分析课程设计任务书beta.doc_第3页
第3页 / 共39页
[互联网]TCPIP协议分析课程设计任务书beta.doc_第4页
第4页 / 共39页
[互联网]TCPIP协议分析课程设计任务书beta.doc_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《[互联网]TCPIP协议分析课程设计任务书beta.doc》由会员分享,可在线阅读,更多相关《[互联网]TCPIP协议分析课程设计任务书beta.doc(39页珍藏版)》请在三一办公上搜索。

1、TCP/IP协议分析课程设计任务书及指导书武汉工业学院 数学与计算机学院2012-12-1836目录目录2课程设计课题内容4课题内容设计思路4客户端:4界面设计分析:4框架设计分析6服务器:8服务器功能分析8框架设计分析:9源代码10通信子系统源代码:10ChatClient.java10ChatClientHandler.java14ChatServer.java17ChatServerHandler.java19ChatProtocolImpl.java22ChatProtocolStruct.java29CmdType.java32通信子系统测试源代码:33UserLoginWnd.ja

2、va33ChatClientGUI.java38WndShow.java48类分布结构51m包:51chatsystem.gui包:51chatsystem.util51测试环境描述:51测试说明:51“连接服务器”按钮:52“退出”按钮:52其他控件:53测试结果截图:53课程设计要求:53主要工作:53课程设计报告撰写要求:53设计思路和实现方法:54程序运行测试截图54课程设计总结54封面模板55课程设计课题内容设计并开发出一个简单的即时通讯系统,包括通讯客户端和服务器。客户端采用GUI模式进行设计,而服务器端采用后台方式工作。客户端功能:n 注册新用户n 登录服务器;n 显示当前服务器

3、在线用户;n 群聊;n 私聊;服务器功能:n 创建新用户;n 验证客户端登录;n 实现客户端消息的转发;课题内容设计思路客户端:界面设计分析:用户登录窗口UserLoginWnd接收数据:用户名、密码数据来源:用户输入业务处理:1. 向服务器发送登录请求,送出用户名和密码;2. 接收服务器反馈,成功则进入客户端主窗口;3. 打开注册新用户窗口;用户注册窗口UserRegisterWnd接收数据:用户名、密码、密码确认数据来源:用户输入业务处理:1. 判断密码和密码确认是否一致;2. 向服务器发送注册新用户请求,送出用户名和密码;3. 接收服务器反馈,成功则回到用户登录窗口;客户端主窗口Main

4、ChatWnd接收数据:用户列表信息、当前用户将发送消息;服务器转发某用户的群发消息;数据来源:网络传输、用户输入业务处理:1. 接收服务器发来的已登录用户信息,刷新Tree控件;2. 接收服务器转发来的群聊消息,追加消息到文本框中;3. 将当前用户输入的消息发送给服务器;4. 当前用户双击Tree控件中的对应某个用户的节点时,打开私聊窗口私聊窗口PersonChatWnd接收数据:正在私聊的用户信息;服务器转发来的文本消息;当前用户输入的消息数据来源:网络传输、用户输入业务处理:1. 接收服务器转发来的私聊消息;2. 将当前用户输入的文本信息发送给服务器;通过界面设计分析后,应该大概清楚本系

5、统的客户端应具备哪些功能了。下面开始进行系统设计的实质性分析,也就是框架设计。这里我们采用分层的模式进行设计。大概应该分哪几层呢?框架设计分析显示层:包括客户端的窗口类;UserLoginWnd.java实现用户登录窗口布局UserRegisterWnd.java实现用户注册窗口布局MainChatWnd.java实现系统主窗口布局UsersTree.java实现系统主窗口中用户树PresonChatWnd.java实现私聊窗口布局业务层包括客户端窗口类处理的业务逻辑实现类;UserLoginLogic.java实现用户登录的业务逻辑UserRegisterLogic.java实现用户注册的业

6、务逻辑GetLoginedUsersLogic.java实现获取已登录用户信息的业务逻辑MessagesHandlerLogic.java实现接收和发送消息要处理的业务逻辑通信层包括客户端与服务器通信协议的实现类;ChatProtocolImpl.java实现本系统应用层协议ChatClient.java实现与服务器的通信综合分析后得到各个类之间的静态关系图如下所示。图中带箭头的虚线表示虚线尾连接的对象会调用箭头指向的对象。对于上面类静态图,这里进行一个简要的解释。n 本系统客户端启动时,将创建UserLoginWnd对象,用于打开“登录窗口”,并等待用户的操作。如果用户点击了“登录”按钮,就

7、要调用UserLoginLogic,对用户输入的用户名和密码进行检查,如果一切正常,那么调用ChatClient将用户名和密码发送给服务器,并等待服务器的回馈信息,如果成功登录,则UserLoginLogic返回true给UserLoginWnd对象,登录窗口退出,并通知ChatSystemClient对象,登录服务器成功,进而调用MainChatWnd对象,以显示系统主窗口。n 主窗口中有一棵显示已登录用户的树,要创建这棵树需要获取已登录用户的信息,MainChatWnd类将UsersTree对象作为其私有成员,UsersTree中可能有一个CreateTree的方法,用来创建该树,不过首先

8、要调用GetLoginedUsersLogic对象获取已登录用户的信息,该信息需要从服务器端获取,因此要调用ChatClient向服务器发出获取已登录用户信息的通信请求,获得信息后,以供CreateTree方法创建用户信息树。n 在主窗口中,当用户需要发送一条群发消息时,需要调用MessagesHandlerLogic对象,组织好要发送的消息,以及发送地址等一切发送准备工作,然后调用ChatClient对象,将消息发送给服务器;当服务器转发消息到来时,MessagesHandlerLogic对象将接收到的消息进行处理并格式化输出到主窗口的接收信息文本框中。n 在主窗口中,当用户点击用户树上的某

9、个节点时,会打开PersonChatWnd对应的窗口,本地用户可以通过该窗口与对应用户树的那个节点关联的远端用户进行私聊。n ChatProtocolImpl类负责实现本系统的应用层通信协议,完成构造要发送的协议命令或对接收到的协议命令进行处理。u 登录验证:命令类型、本地用户名、密码u 登录验证返馈:命令类型、操作结果u 注册新用户:命令类型、本地用户名、密码u 注册用户返馈:命令类型、操作结果u 发送群消息:命令类型、本地用户名、消息、时间u 获取用户列表:命令类型u 用户列表返馈:命令类型 用户名列表u 发送私聊消息:命令类型、本地用户名、消息、远程用户名、时间协议数据包结构:class

10、 ChatProtocolStruct implements Serializablebyte cmdType;String localName;String password;String msg;String peerName;byte result;Time sendTime;Array userList;n ChatClient类负责进行实际网络通信传输。服务器:服务器采用控制台模式设计,因此没有界面设计的问题。服务器功能分析登录验证;创建新用户;转发消息;框架设计分析:以上是从整体上对本课程设计计划设计并开发的即时通讯系统的一个大致描述。在设计过程中可以参考以上设计思路,但也需要根据

11、实际情况进行调整。从本质上讲,即时通讯系统很大程度上就是设计底层的通信子系统,通信子系统设计好之后,不管前端用户界面是什么,都可以进行简单调整后,实现不同用户界面的通信。源代码基于Apache的mina架构设计的本课程设计课题的通信子系统的源代码。通信子系统源代码:ChatClient.java实现客户端连接、发送、和关闭等package m;import .InetAddress;import .InetSocketAddress;import javax.swing.JPanel;import org.apache.mina.core.filterchain.DefaultIoFilter

12、ChainBuilder;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

13、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

14、 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 conne

15、ct()connector = new NioSocketConnector();connector.setConnectTimeoutMillis(3000);DefaultIoFilterChainBuilder filterChain = connector.getFilterChain();filterChain.addLast(codec, new ProtocolCodecFilter(new ObjectSerializationCodecFactory();connector.setHandler(new ChatClientHandler(panel);ConnectFutu

16、re 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

17、()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;pu

18、blic 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 cha

19、tsystem.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.a

20、pache.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

21、 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 Aut

22、o-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);Syste

23、m.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:

24、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(),s

25、tr);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.pr

26、intln();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.O

27、bjectSerializationCodecFactory;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(); p

28、ublic boolean start() DefaultIoFilterChainBuilder filterChain = acceptor.getFilterChain(); / 添加编码过滤器 处理乱码、编码问题 filterChain.addLast(mycodec, new ProtocolCodecFilter(new ObjectSerializationCodecFactory(); / 设置核心消息业务处理器 acceptor.setHandler(new ChatServerHandler(); / 设置session配置,30秒内无操作进入空闲状态 /acceptor.

29、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(); ChatServerHan

30、dler.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.m

31、ina.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)throw

32、s 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);ses

33、sion.setAttribute(cps.getSName();/处理接收到的私聊消息,并转发给特定用户if(cps.getCmdType() = CmdType.PERSONCHAT_MSG.getIndex()Collection sessions = session.getService().getManagedSessions().values();for(IoSession s:sessions)if(s.getAttribute(key) = cps.getDName()s.write(cpi.createForwardMsg(cps);break;/处理群聊消息,并转发给所有连

34、接到服务器的用户if(cps.getCmdType() = CmdType.GROUPCHAT_MSG.getIndex() System.out.println(接收一条群聊消息!);Collection sessions = session.getService().getManagedSessions().values();for(IoSession s:sessions)s.write(cpi.createForwardMsg(cps);Overridepublic void messageSent(IoSession session, Object message) throws E

35、xception / 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

36、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 /*用

37、户认证 * 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)/未实现。需要根据保存数据的数据

38、源,写相应代码创建新用户。 return false; /*获取用户列表 * return */private ArrayList getLoginedUsers() /未实现。需要根据保存数据的数据源,写相应代码完成userList的填充工作ArrayList userList = new ArrayList();return userList;/*构造认证确认包 * param paramCps * return */public ChatProtocolStruct createVerifyAck(ChatProtocolStruct paramCps)ChatProtocolStruc

39、t 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 ChatPr

40、otocolStruct 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.

41、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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号