Internet课程设计.docx_第1页
Internet课程设计.docx_第2页
Internet课程设计.docx_第3页
Internet课程设计.docx_第4页
Internet课程设计.docx_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

一、 课程设计目的了解C/S模型,熟悉常见的WINSOCK API函数,它是微软提供的网络编程接口函数,利用它,应用层程序可以跟TCP/IP协议打交道,用WINSOCK API函数设计一个面向连接的通信程序。二、 课程设计任务1. 具有聊天界面。2. 分为TCP聊天服务器和TCP两天客户端两个模块。3. 用WINSOCK API编程接口函数和多线程实现,支持多客户连接服务器。三、 设计方案1.服务器端和客户端功能设计一个网络聊天室的运行,首先是要有一个完整稳定的服务器端,并且拥有很多个服务器端。客服端要具有实现用户注册和用户登陆,在登陆成功后,要显示出公聊界面,实现聊天功能并且能够发送表情和保存聊天内容和显示聊天记录等功能,在新用户上线和用户下线时要更新每个客户端在线用户列表名,并且可以和在线的用户实现一对一的私聊功能。 在服务器端可以实现不断的监听客服的连接,并且根据客户端发送过来的不同信息如注册信息,登录信息,公聊信息,私聊信息,退出信息等,服务器端要做出不同的响应。 (1) 服务器端功能: 可以不断的监听客户端请求 服务器开启状态、显示登陆客户的信息、用户在线列表 发送系统消息 (2) 客户端功能模块图如图3.1所示: 用户登录功能,实现合法注册用户的登陆。 私聊功能,实现用户和在线的其他用户一对一的聊天方式。 公聊功能,实现用户和在线的所有用户聊天方式2.系统实现设计 当用户聊天时,将当前用户名、聊天对象、聊天内容、聊天语气和是否私聊进行封装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端。 当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,然后将其强制转换为Chat对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问。 接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,在本程序中设定的是3秒刷新服务器一次,如果间隔时间太短将会增加客户端与服务器端的通信负担,而间隔时间长就会让人感觉没有时效性,所以经过权衡后认为3秒最佳,因为每个用户都不可能在3秒内连续发送信息。 当每次用户接收到聊天信息后将会开始分析聊天信息然后将适合自己的信息人性化地显示在聊天信息界面上。图1 系统实现原理图3.系统的设计过程 (1) 用户的登录/退出 用户发送登录请求,客户端获取用户登录信息并发送到服务器端,服务器启动用户登录管理线程,获取用户名和密码进行登录验证,将验证结果返回客户端显示,下图为普通用户登录/退出系统的时序图:图2 登录退出系统时序图(2)发言 发言是聊天室的核心功能,用户提出发言请求,客户端接受发言的内容和其他各种设置(公聊或私聊),打包发给服务器端。服务器接收到请求后确定聊天方式。服务结果最后显示在客户端。下图为发言的时序图。图3 发言时序图四、 算法或框图、关键代码说明1.算法或框图聊天室的总体设计过程,就是当客户端发出信息时,我们将数据写到socket,当对方有数据到达时,我们从socket读出来并显示给客户。程序关键在于如何监听到有信息到达的过程。应用程序流程图如下图所示,开始是先创建主窗口,然后初始化窗口,程序下面才开始消息循环处理。如果没有消息循环的活,直接结束掉这个程序。如果有循环的话,要判断这个窗口消息的内容是哪种类型,然后再进行选择处理方式。图4 应用程序流程图2.关键代码说明ChartServer.Java中,针对每一个客户端的连接请求的处理代码:public class ChatHandler implements Runnableprotected ClientInfo clientInfo = new ClientInfo();/用户信息protected Socket socket; /套接字protected ObjectInputStream in; /对象输入流protected ObjectOutputStream out; /对象输出流protected Thread listener; /指定的用来处理用户的线程 public ChatHandler(int clientID, Socket socket)clientInfo.clientId = clientID; /客户端口号this.socket = socket;protected boolean handShake() /握手过程中设置参数clientInfo.clientName = (String)in.readObject();if(window.clientList.size()0 &window.clientList.indexOf( clientInfo.clientName )!= -1 )ConnectionNotice status = new ConnectionNotice();status.status = false;out.writeObject( status );out.flush();socket.close();return false;ConnectionNotice status = new ConnectionNotice();status.status = true;out.writeObject( status );/将用户加入列表中,并把列表发回给用户window.clientList.addElement(clientInfo.clientName);out.writeObject(window.clientList);/通知所有别的用户有新用户加入/构建相应的协议并广播UpdateList newClient = new UpdateList();newClient.requestType = true;newClient.newClient = clientInfo.clientName;broadcast( newClient );onlineUsers+;return true;public synchronized void start() /建立一个新连接if (listener = null)out = new ObjectOutputStream(socket.getOutputStream() );in = new ObjectInputStream(socket.getInputStream();ConnectionNotice status = new ConnectionNotice();if ( onlineUsers = serverLimit ) /如果在人数已经超过上限status.status = false;out.writeObject( status );out.flush();socket.close();return;status.status = true;out.writeObject(status);if( !handShake() ) /如果没有设定用户信息return;/创建新的线程,并监听 此线程listener = new Thread( this );listener.start(); ChartClient.java中开始连接服务器的程序代码:synchronized boolean connectToServer()getConfiguration();InetAddress addr = InetAddress.getByName(serverAddress ); /获得服务器地址socket = new Socket(addr,serverSocketNumber);in = new ObjectInputStream(socket.getInputStream();/输入流out = new ObjectOutputStream(socket.getOutputStream();/输出流if(!handShake()return false;listener.running = true;/是第一次连接则开启listener对象if( listener.isAlive() = false) listener.start();connected = true;return true;ChartClient.jsp中用户向服务器发送信息的代码:/将数据从用户端发送到服务器端void sendPublicMessage( String userMsg ) throws IOException Message msg = new Message();/产生新的信息msg.audience = true;msg.roomNumber = 0;/聊天室号码msg.senderId = clientID;msg.message = Name + says + userMsg;out.writeObject( msg );/发送信息out.flush();/清空信息/只是对于一个用户发送信息void sendPrivateMessage(int recipient,String userMsg) throws IOExceptionMessage msg = new Message();msg.audience = false;msg.recieverId = recipient;msg.senderId = clientID; /设定用户号msg.message = Name + says + userMsg;out.writeObject( msg );out.flush();五、 系统调试及结果运行服务器端,跳出服务器端的窗口如下,(现在服务器处于监听状态):运行客户端,跳出客户端的窗口如下(客户端还未与服务器进行连接):在顶部菜单栏选中Flie-Connect可以打开连接服务端的对话框:在对话框中输入用户名,单击确定,便可以与服务器建立连接:客户端与服务器端之间建立连接之后,在客户端会显示有用户登录,在线用户列表中会相应多出该用户,效果图如下:同时有三个用户在线,这三个用户可以在公告聊天室Main Room中聊天,其中一个用户发送的信息在另外两个用户的窗口中都可以显示出来。用户Lydia发送的消息“早上好啊,各位!”用户Ida和Lily都收到了,并给出回复,以上所有的消息在三个用户之间是透明的,效果图如下:同时,每个用户可以选择只与一个用户单独聊天,如下图所示。Ida用户在自己窗口的在线用户列表中点击 Lydia用户,打开与Lydia对话的窗口,编辑消息“记得今天要开会呦”发送给Lydia,在用户Lydia的窗口中会自动跳出与Ida的对话框,Lydia只要打开就可以看见Ida单独发送给自己的消息,他也编辑消息“恩恩,知道了,谢谢提醒”并发送给Ida,这样的两条信息之有Ida和Lydia两个用户可以看见,用户Lily并不知道,效果图如下:当其中一个用户要离开时,在顶部菜单栏选中Flie-disconnect,单击disconnect,便可以断开与服务器之间的连接,如下图:当某一用户下线时,与之聊天的用户会收到提醒。用户Lydia下线时,用户Ida会收到下线提醒“Lydia Has Logged Out”,效果图如下:在用户离线之后,服务器端会显示用户离线信息,同时服务器端和各客户端的在线用户列表中会相应把一下线的用户去除。用户Lydia下线之后,在服务器端的在线用户不再有Lydia的名字,效果图如下:六、 改进意见与收获体会1.改进意见和许多大型的网络聊天室相比该小聊天室功能比较简单,只实现了聊天的基本功能,点对点聊天,点对多点聊天等,在聊天的过程中发送的文字的字体、大小、颜色都不能改变,也不可以发送表情、传送文件、发送图片、视频聊天。在本次课程设计中,每次消息的传递都没有时间记录,并且由于没有使用数据库,没有用户验证,只要随便输入用户名就可以登录到服务器,并且所有的聊天内容只是显示一下,没有聊天记录。2.收获体会这次的课程设计让我受益匪浅。在理论课的学习中,我掌握了Internet技术这门课的理论知识。在这次的课程设计中,我曾遇到了许多困难,而在克服这些

温馨提示

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

评论

0/150

提交评论