java c s聊天程序_基于C/S模式的简单聊天程序(附程序源码)

基于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负责创建客户端,而一个进程只需调用并启动线程就可以实现客户端的上线聊天功能。

其中系统的结构图如下:

b169fcd2d05fdba8bea52434895c7230.png

系统实现的流程图如下:

852b28ac50ad403d9c76634ed77fa28a.png

三、设计结果(文字说明+截图)

1.客户端登录,输入登录名,如果没有输入登录名则会提醒重新输入。

2f5e711de1274a87023e7e6857742c95.png

2.服务端显示在线人数情况(下图启动三个客户端)利用用户登录时输入的登录名,用Map记录用户的登录名和对应的socket,因此可以直接输入在线人数的情况。

a7c306e0bdc50f6bc5402d79402c51a2.png

a2452bc6e37d20dd80e08f84da03174c.png

3.群聊:如果用户的信息没有指定的特殊符号,则认为是群聊信息,由服务端转发给所有的客户端。

6c1f0c228a662ed8af8a7a6b1ad8c616.png

4.私聊:服务端检查到客户端发送的信息格式为:@[用户名]-[聊天信息],则会将用户的信息转发到指定用户名的客户端。

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值