Java网络编程–TCP+多线程 实现聊天室群聊功能
功能描述:
简单的聊天室,可以有多个用户同时加入聊天,每个用户可以随时发送消息,其他用户都会收到该用户的信息(显示发送者姓名)
分析:
1.采用TCP实现,服务端需要完成的任务:
(1)为每个加入聊天室的用户创建一个服务线程,该线程用于接收该用户的信息并发送给其他用户
(2)用户加入和退出聊天室时给出相应的提示信息
(3)用户退出时,结束其服务线程
2.客户端需要随时接收其他用户的信息,同时也要发送信息,因此单独创建一个线程来完成接收信息的功能
3.为了保存所有加入了聊天室的用户的信息,创建一个public static的容器,存放用户信息
代码实现:
ServerThread.java
//服务器端用到的类,实现Runnable接口
package tcp.simpleCharRoom;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
/**
* @author Zqr
*/
public class ServerThread implements Runnable{
private Socket server = null;
private DataInputStream dis = null;
private DataOutputStream dos = null;
private String username = null; //该实例服务的用户的名字
private boolean isRunning = true; //服务结束的标志
//构造方法
public ServerThread(Socket server) {
this.server = server;
//通过Socket实例构造输入输出流
try {
this.dis = new DataInputStream(server.getInputStream());
this.dos = new DataOutputStream(server.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
//将该线程加入list集合
Server.list.add(this);
//获取该用户的姓名
String username = receiveMsg();
this.username = username;
//发送系统欢迎信息
sendSystemMsg(this.username+" 加入了聊天室");
//多次接收与发送
while(isRunning){
//接收信息
String msg = receiveMsg();
//发送信息
sendMsg(msg);
//收到bye时退出循环,结束该实例的线程
if(msg.equals("bye")) isRunning = false;
}
//线程结束时关闭资源
release();
//从list中移除
Server.list.remove(this);
//发送系统提示信息
sendSystemMsg(this.username+" 退出了聊天室");
}
/**
* 接收信息的方法
* @return
*/
private String receiveMsg(){
String msg;