课程设计说明书
基于TCP协议的即时通讯系统(JA V A多用户群聊)
研究意义
1.1课程设计意义及背景
在网络越来越发达的今天,人们对网络的依赖越来越多,各种网络应用层出不穷,网络编程越来越受大广大程序员的重视。
Java语言创建之初的目的之一就是为了能够很好地进行网络通信。
简单的说,网络编程就是与其他计算机进行信息交换。
网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。
网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。
在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。
而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。
目前较为流行的网络编程模型是客户机/服务器(C/S)结构。
即通信双方一方作为服务器等待客户提出请求并予以响应。
客户则在需要服务时向服务器提出申请。
服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。
1.2 研究内容
1.本次课程设计用java语言的AWT和Swing设计用户界面,java语言的网络编程和多线程设计实现后台。
顺利完成了一个实现了多用户群聊的基于TCP协议的即时通讯系统。
2. 基于TCP协议的即时通讯系统所表示的就是一个通过java网络编程和多线程实现的C/S架构的简单的群聊系统,其包括:打开服务器界面,设置相应的合法端口,根据合法端口启动服务器,根据合法的用户名密码和端口号进行用户登陆,服务器和聊天室的在线用户列表显示,客户端之间的群聊等操作。
2.1设计要求:
完成N个生产者和M个消费者之间的并发控制,N、M不低于5,数据发送和接收缓冲区大小不小于10个。
某个生产者进程生产的消息供K个消费者进程消费。
K《=M。
某些消费进程消费多个生产者生产的消息。
生产者和消费者之间的对应关系可以在程序开始有一个文件中读入,也可以动态调整。
每个生产进程生产M个消息后结束运行。
如果一个消费者进程没有对应的生产者进程在运行后,也结束运行。
进程间通信、并发(同步/互斥)、文件读写
内存管理、Dll、Windows消息机制、IO (尚未最终定型)
3.功能模块图
服务器端的主要功能如下。
a) 在特定端口上进行侦听,等待客户端连接。
b) 用户可以配置服务端的侦听端口,默认端口为8888。
c) 向已经连接到服务器端的用户发送系统消息。
d) 统计在线人数
e) 当停止服务时,断开与别的用户连接。
客户端的主要功能如下。
f) 连接到已经开启聊天服务的服务端。
g) 用户可以配置要连接服务器的IP 地址与端口号。
h) 当服务器开启的话,用户可以随时登录与退出。
i) 用户可以向所有人或者某一个人发送消息。
本次课程设计,用到了套接字、数据报通信、URL 与URLConnection 的相关技术,实现了一个可以进行简单通信的小型聊天室系统的开发。
图2.1 服务器端功能模块图
图2.2客户端功能模块图
一、 系统的功能结构图
基于TCP 协议的即时通讯系统包含五大功能模块,分别是服务器端口设置,服务器启动,服务器在线用户列表显示,客户端登陆,客户端群聊,客户端在线用户列表显示。
系统功能结构图如图2.8所示。
客户端 端口设置
用户设置 登录
发送消息
连接设置
退出
退出
图2.3 系统结构图
4.技术实现
服务器和客户端登陆以及客户端群聊界面利用java 语言的AWT 和Swing 实现,群聊功能利用java 语言网络编程的多线程和网络编程的知识实现。
5.详细设计
本系统中我们利用Java 实现基于C/S 模式的聊天室系统,分为服务器端和客户端两部分,运用Socket 套接字实现客户方和服务方的链接,服务器端通过端口设置在特定端口上进行监听,等待客户端的连接,一旦客户端连接成功,则可以向连接成功的用户发送系统消息,可以接收所有客户端发送的消息并显示;客户端则与服务器端规定的端口进行连接,连接成功后可以登录,登录成功后便可以和所选的对象聊天,可以发送信息,也可以接收聊天对象所发送过来的信息,并显示信息内容。
即时通讯系统
服务器
客户端
端口设置
服务器启动
注册、 登录
私聊、 群聊
在线用户列表
在线用户列表
服务器 客户端A
客户端B
客户端C
客户端E
客户端D
聊天室数据流图
5.1 服务器端监听功能的实现
服务器端监听功能实现的流程如下:
首先,利用ChatServer.java添加时间事件侦听与事件处理,来启动和停止服务,通过调用ServerListen.java类实现对于服务器端界面用户上线与下线功能的监听,该类对用户上线下线的侦听是通过调用用户链表类(UserLinkList)来实现的,当用户上线或下线情况发生变化时,该类会对主类的界面进行相应的修改。
对于服务器端界面用户上线与下线功能的监听通过serverListen.java来实现,首先服务器端处在监听的状态,同时创建输入输出流,得到客户端的登录信息,将上线下线的具体信息显示在服务器界面上。
服务器端监听用户上线下线功能的流程图如下所示:
socket(),建立数据报
套接字
bind()套接字,与本
地地址相链接
listen(),通知TCP,服
务器准备好套接字
客户端是否成
功登录
否
是
accept(),接受连接,
等待客户端的链接
建立连接,通过输入输出流得到客户端登录信息
显示用户上线下线信息,对服务器端的界面进行相应修改
closesocket(),关闭新建
立的套接字
closesocket()关闭最初建立的套接字
5.2服务器启动服务功能的业务逻辑
在chatServer.java的事件处理中调用startService()方法,首先创建一个新的serverSocket 对象,在启动服务的同时通过用户链表启动监听线程,实现实现上线下线用户的侦听,其业务流程图如下所示:
建立socket()数
据报套接字
创建监听线程
通过监听线程启
动服务。