Java基于Socket实现简单QQ聊天详细教程
一.引言
- 技术框架:
1.1 Java编程
1.2 Socket实现通信
1.3 多线程编程
1.4 JFrame 设计界面 - 实现思路
如图,基本架构就是设计一个服务端(端口确定)以及多个客户端(可随机可指定)。客户端之间并不直接通信,而是通过同一个服务端进行消息传输。
服务端:响应客户端连接,接受客户端消息,消息群发
客户端:通过服务器ip以及port连接对应服务器,发送消息,接受服务端消息,将消息通过界面展示
二.环境
操作系统:WindowsXP
工具:IDEA,JDK13
三.具体过程
1.QQServer(服务端)
1.1 成员变量
```java
/*标志服务端是否开启*/
private boolean isStart;
/**
* 服务端使用ServerSocket,port作为监听的端口
* 客户端使用Socket
*/
private ServerSocket serverSocket;
/**
* 客户端集群
*/
private List<Client> clients;
1.2 构造函数
public QQServer(String host,int port){
try {
serverSocket=new ServerSocket();
SocketAddress socketAddress=new InetSocketAddress(host,port);
serverSocket.bind(socketAddress,port);
isStart=true;
clients=new ArrayList<>();
System.out.println("服务器启动成功!"+serverSocket.getLocalSocketAddress());
}catch (Exception e){
System.out.println("服务器启动异常: "+e.getMessage());
System.exit(0);
}
}
主要是进行变量初始化以及绑定服务器ip以及端口
1.3 实现多线程
由于服务端要一直处理客户端连接,消息的接受与发送,于是我们需要将其设计为多线程。实现多线程的方式主要有四种:继承Thread类,实现Runnable接口,实现Callable接口,匿名内部类。这里,选择第一种。
public class QQServer extends Thread
覆写 start方法,这里是处理客户端的连接,Client是服务端内部的客户端存储类,目的是为了将远程客户端抽象为内部Socket对象存储,存储后便启动该对象线程来接受消息,显然,client也应当是多线程的。详细之后会介绍。
@Override
public synchronized void start() {
try {
System.out.println("等待连接中...");
while (isStart){
/*循环等待*/
Socket socket=serverSocket.accept();
System.out.println("连接成功! Address: "+socket.getRemoteSocketAddress());
Client client=new Client(socket);
clients.add(client);
System.out.println("当前在线人数: "+(clients.isEmpty()