java基础实现聊天室功能,群聊,私聊(UTP,读写流,ServerSocket,Socket运用)
1.消息发送工具代码
package com.liangrui.chatPlace;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class SendUtil implements Runnable {
private BufferedReader bufferedReader; //输入流
private DataOutputStream dataOutputStream; //输出流
private Socket client; //客户
private boolean whetherRunning; //是否继续运行
private String name; //用户名
public SendUtil(Socket client,String name){
this.client=client;
this.name=name;
this.whetherRunning=true;
bufferedReader=new BufferedReader(new InputStreamReader(System.in));
try {
dataOutputStream=new DataOutputStream(client.getOutputStream());
//发送用户名
send(name);
} catch (IOException e) {
e.printStackTrace();
release();
}
}
@Override
public void run() {
while (whetherRunning){
String msg=getMsgFromConsole();
send(msg);
//如果输入bye,则客户退出
if ("bye".equals(msg)){
release();
}
}
}
private void send(String msg){
try {
dataOutputStream.writeUTF(msg);
dataOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
release();
}
}
private void release(){
this.whetherRunning=false;
ReleaseUtil.release(bufferedReader,dataOutputStream,client);
}
private String getMsgFromConsole(){
try {
return bufferedReader.readLine();
} catch (IOException e) {
e.printStackTrace();
return "输入消息时,网络出错啦!!!";
}
}
}
2.消息接收工具代码
package com.liangrui.chatPlace;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
public class ReceiveUtil implements Runnable{
private DataInputStream dataInputStream;//输入流
private Socket client;//客户
private boolean whetherRunning;//是否继续运行
public ReceiveUtil(Socket client){
this.client=client;
this.whetherRunning=true;
try {
dataInputStream=new DataInputStream(client.getInputStream());
} catch (IOException e) {
e.printStackTrace();
release();
}
}
private String receive(){
try {
return dataInputStream.readUTF();
} catch (IOException e) {
e.printStackTrace();
release();
return "接收消息时,网络出错啦!!!";
}
}
@Override
public void run() {
while (whetherRunning){
System.out.println(receive());
}
}
private void release(){
this.whetherRunning=false;
ReleaseUtil.release(dataInputStream,client);
}
}
3.资源释放工具代码
package com.liangrui.chatPlace;
import java.io.BufferedInputStream;
import java.io.Closeable;
import java.io.IOException;
import java.net.Socket;
public class ReleaseUtil {
public static void release(Closeable... targets){
for (Closeable target : targets) {
if (target!=null){
try {
target.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.用户代码,一个用户代表一个客户端
package com.liangrui.chatPlace;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.concurrent.CopyOnWriteArrayList;
public class User implements Runnable{
private CopyOnWriteArrayList users;
private DataInputStream dataInputStream; //输入流,用来接收数据
private DataOutputStream dataOutputStream; //输出流,用来发送数据
private Socket client; //客户
private boolean whetherRunning; //是否继续运行
private String name; //用户名
public User(Socket client,CopyOnWriteArrayList users){
users.add(this);
this.users=users;
this.client=client;
whetherRunning=true;
try {
dataInputStream=new DataInputStream(client.getInputStream());
dataOutputStream=new DataOutputStream(client.getOutputStream());
//获取用户名
this.name=receive();
//欢迎你的到来
this.send("欢迎您,"+this.name);
sendOthers(this.name+"来到了良睿聊天室",true);
} catch (IOException e) {
e.printStackTrace();
release();
}
}
private void send(String msg){
try {
dataOutputStream.writeUTF(msg);
dataOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
release();
}
}
private String receive(){
try {
return dataInputStream.readUTF();
} catch (IOException e) {
e.printStackTrace();
release();
return "";
}
}
private void sendOthers(String msg,boolean isSys){
//是否私聊,有@表示私聊,否则为群聊
boolean whetherPrivate=msg.startsWith("@");
if (whetherPrivate){
//:所在的下标
int idx=msg.indexOf(":");
//获取目标
String targetName=msg.substring(1,idx);
//发送的消息
msg=msg.substring(idx+1);
for (User user : users) {
if (user.name.equals(targetName)){//找到目标
user.send(this.name+"悄悄地对您说:"+msg);
}
}
}else {//不是私聊,是群聊
for (User user : users) {
if (user==this){//如果是自己则不做处理
continue;
}
if (isSys){//系统消息
user.send(msg);
}else {//群聊
user.send(this.name+"对所有人说:"+msg);
}
}
}
}
private void release(){
this.whetherRunning=false;
ReleaseUtil.release(dataInputStream,dataOutputStream,client);
//退出
users.remove(this);
sendOthers(this.name+"离开了大家庭...",true);
}
@Override
public void run() {
while (whetherRunning){
String msg=receive();
if (!"".equals(msg)){
sendOthers(msg,false);
}
}
}
}
5.服务器代码
package com.liangrui.chatPlace;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.CopyOnWriteArrayList;
public class Server {
//在线的用户列表
private static CopyOnWriteArrayList users =new CopyOnWriteArrayList();
public static void main(String[] args) throws IOException {
System.out.println("---------------服务器------------------");
//指定端口,使用ServerSocket创建服务器
ServerSocket server=new ServerSocket(8888);
//阻塞式等待连接
while (true){
Socket client=server.accept();
System.out.println("一个用户建立了连接");
User user=new User(client,users);
new Thread(user).start();
}
}
}
6.客户端代码
package com.liangrui.chatPlace;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
System.out.println("-----------客户端---------------");
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入用户名:");
String name=bufferedReader.readLine();
//建立连接客户端
Socket client=new Socket("localhost",8888);
//一个线程发送消息,一个线程接收消息
new Thread(new SendUtil(client,name)).start();
new Thread(new ReceiveUtil(client)).start();
}
}
7.实际运行情况
---------------服务器------------------
一个用户建立了连接
一个用户建立了连接
一个用户建立了连接
-----------客户端---------------
请输入用户名:
张三
欢迎您,张三
李四来到了良睿聊天室
王五来到了良睿聊天室
啦啦啦
王五悄悄地对您说:你是张三吗?
@王五:是的,请问你是?
王五悄悄地对您说:我是王五呀,大哥!
@王五:原来是王五呀,幸会幸会!!
李四对所有人说:bye
李四离开了大家庭...
-----------客户端---------------
请输入用户名:
李四
欢迎您,李四
王五来到了良睿聊天室
张三对所有人说:啦啦啦
bye
-----------客户端---------------
请输入用户名:
王五
欢迎您,王五
张三对所有人说:啦啦啦
@张三:你是张三吗?
张三悄悄地对您说:是的,请问你是?
@张三:我是王五呀,大哥!
张三悄悄地对您说:原来是王五呀,幸会幸会!!
李四对所有人说:bye
李四离开了大家庭...
到此,java基础实现聊天室功能已完成。有问题随时评论,觉得有用的话记得点个赞哦!
在代码实例中学习知识,学和用兼备,想要长期学习的小伙伴记得关注哦!