基于C/S模式的简单聊天程序(附程序源码)
一、需求分析
设计要求
使用Socket实现网上聊天功能。用户可以通过客户端连接到服务器端并进行网上聊天。聊天时可以启动多个客户端。服务器端启动后,接收客户端发来的用户名和密码验证信息。验证通过则以当前的聊天客户列表信息进行响应;此后接收客户端发来的聊天信息,转发给客户端指定的聊天客户(即私聊)或所有其他客户端;在客户断开连接后公告其退出聊天系统的信息。客户端启动后在GUI界面接收用户输入的服务器端信息、账号和密码等验证客户的身份。验证通过则显示当前系统在线客户列表。客户可以与指定对象进行私聊,也可以向系统中所有在线客户发送信息。
实现本程序需要了解网络基础知识,掌握C/S结构的工作特点,掌握数据结构、高级语言及网络编程知识,可以选择Visual C++、C或Java等语言实现。
二、设计过程与相关理论
程序设计是基于TCP协议,采用C/S模式实现简单的一对多聊天(群聊)、一对一聊天(私聊)。TCP是一种可靠的、基于连接的网络协议,它是面向字节流的,即从一个进程到另一个进程的二进制序列。一条TCP连接需要两个端点,这两个端点需要分别创建各自的套接字。通常一方用于发送请求和数据(在这里为聊天的客户端),而另一方用于监听网络请求和数据(在这里为服务端)。
常用于TCP编程的有两个类,均在java.net包里,这两个类为:Socket、ServerSocket。
关于Socket
Socket是建立网络连接使用的,在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需要的对话。
Socket类有多个构造方法:
(1)public Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上。
(2)public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 创建一个流套接字,指定了本地的地址和端口以及目的地址和端口。
(3)public Socket() 创建一个流套接字,但此套接字并未指定连接。
Socket常用的几个工具方法,用于处理网络会话:
(1)public InputStream GetInputStream() throws IOException 该方法返回程序中套接字所能读取的输入流。
(2)public OutputStream getOutputStream() throws IOException 该方法返回程序中套接字中的输出流。
(3)public void close () throws IOException 关闭指定的套接字,套接字中的输入流和输出流也将被关闭。
(4)除了以上一个常用的方法外,Socket还提供了想connect(SocketAddress endpoint)用于连接到远程服务器,getInetAddress()获取原处服务器的地址等。
关于ServerSocket
ServerSocket类实现服务器套接字,等待请求通过网络传入,基于该请求执行某些操作,然后可能想请求者返回结果。
ServerSocket有4个构造方法:
(1)public ServerSocket() throws IOException 创建一个服务器套接字,并未指明地址和端口。
(2)public ServerSocket(int port) throws IOException创建一个服务器套接字,指明了监听的端口,如果传入的端口为0则可以在所有空闲的端口上创建套接字。默认接受最大连接数为50,如果客户端链接数量超过50,则拒绝新接入的连接。
(3)public ServerSocket(int port, int backlog) throws IOException创建一个服务器套接字,指明了监听的端口,如果传入的端口port为0,则可以在所有空闲的端口上创建套接字。接受最大连接数有参数backlog设定,如果接受的连接大于这个数,多余的连接被拒绝。参数的backlog的值必须大于0,如果不大于0则采用默认值50。
(4)public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException创建一个套接字,指定了监听的地址和端口,并设置了最大连接数。
**ServerSocket常用的方法如下:**
(1)public Socket accpet() throws IOException该方法一直处于阻塞状态,直到有新的连接接入,建立连接后,该方法会返回一个同于客户端请求以及服务端响应。
(2)public void setSoTimeout(int timeout) throws SocketExcepotion 此方法用于设置accept()方法最大阻塞时间,如果阻塞时间超过了这个值,将会抛出java.net.SocketTimeoutException异常。
(3)Public void close() throws IOExcepiton关闭服务器套接字。
这次简单的聊天小程序可以看成是一个一对多通讯的案例,创建一个Server来管理服务器端的各类处理,其中使用多线程来实现多客户端机制。服务器总是在指定的端口上监听是否相应客户的请求,而服务器本身在启动完成后马上进入监听状态,等待下一个客户端的接入。为了方便实现消息转发的处理,构造一个套接字处理器SocketHandler来负责处理信息。而客户端的话也构建一个ClientHandler类实现了Runnable负责创建客户端,而一个进程只需调用并启动线程就可以实现客户端的上线聊天功能。
其中系统的结构图如下:
系统实现的流程图如下:
三、设计结果(文字说明+截图)
1.客户端登录,输入登录名,如果没有输入登录名则会提醒重新输入。
2.服务端显示在线人数情况(下图启动三个客户端)利用用户登录时输入的登录名,用Map记录用户的登录名和对应的socket,因此可以直接输入在线人数的情况。
3.群聊:如果用户的信息没有指定的特殊符号,则认为是群聊信息,由服务端转发给所有的客户端。
4.私聊:服务端检查到客户端发送的信息格式为:@[用户名]-[聊天信息],则会将用户的信息转发到指定用户名的客户端。