JAVA程序设计之基于TCP协议的socket聊天程序 ,供大家参考,具体内容如下
一、程序实现的功能
1、进入客户端界面
2、创建昵称
3、群发信息
4、@私聊
5、下线通知
6、在线人数统计
二、整体架构图
三、简单介绍
本程序实现了基于TCP通信的聊天程序:
1 服务器端:
服务器端继承JFrame框架,添加组件。创建服务器端的socket,起一个线程池,每接收到一个客户端的连接,分配给其一个线程处理与客户端的通信,将每个客户端的昵称和服务器分配给其的输出流存储到哈希表中。通过检索哈希表中昵称和输出流实现群聊和私聊。
2 客户端:
客户端继承JFrame框架,添加组件。创建客户端的socket,输入昵称,创建客户端socket对应的输入流输出流,与服务器端建立通讯。
四、设计描述
本程序的实现是以服务器端为中继,客户端的所有信息都先发送给服务器端。服务器端辨别是否为私聊信息,私聊信息发送给相应的私聊对象,否则,发送给所有的客户端对象。
(一) 服务器端:
1.1 服务器端继承JFrame框架,添加组件。
1.2 创建服务器端socket。建立一个哈希表,用于存储客户端的昵称以及服务器端对于每个连接的客户端建立的输出流。
1.3建立一个线程池,为每个连接的客户端分配一个执行线程。
1.3调用服务器端Socket的accept()函数,等待客户端的连接,每连接到一个客户端,线程池给相应的客户端分配一个线程。
1.4每个线程内,调用服务器端Socket,封装getOutputStream(),获得服务器端Socket相对应于连接的客户端的输出流和输入流。输入流首先读取到客户端发送来的昵称。将客户端的昵称和服务器端的输出流存储在哈希表中,并遍历整个哈希表,将某人上线的通知发送给所有的在线客户端。
1.5客户端将信息发送给服务器端,当服务器端传来的信息符合“@私聊对象:私聊信息”的格式时,服务器端认为这是私聊信息。服务器端将把私聊对象的昵称从信息中提取出来,通过哈希表找到与昵称对应的输出流。将私聊信息通过输出流发送给私聊对象。
当不是私聊信息时,服务器遍历整个哈希表,通过每个客户端对应的输出流发送给每个客户端。
1.6当客户端下线时,服务器端将移除哈希表中对应存储的客户端昵称以及输出流。并通知在线的每个客户端,某人已下线。
(二) 客户端:
2.1 客户端继承框架JFrame,添加各种组件。
2.2 创建客户端Socket,设置请求连接服务器端IP,以及使用的端口号。
2.3 封装客户端Socket的getInputStream()函数,获得客户端Socket的输入流接受服务器端发来的信息,封装Socket的getOutputStream()函数,获得Socket的输出流向服务器端发送信息。
2.4 通过向文本框添加动作事件监听器,监听文本框的输入。
2.5 当与服务器端连接成功时,系统提醒输入昵称。系统将对输入的昵称进行检索。判断是否有重复的昵称。如有重复则创建不成功,继续输入。
2.6 向服务器端发送信息时,如想对某人发送私聊信息,则需输入符合“@私聊对象的呢称:私聊信息”的格式,此时只有私聊对象和本人可以接收到。否则,发送的信息为公聊信息,所有的客户端都能够收到。
2.7 客户端不断接受服务器端的信息显示在文本域。
五、代码说话
1、服务器端:
package server;
import java.io.*;
import java.net.*;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import javax.swing.*;
import java.awt.*;
public class TCPServer extends JFrame{
pri