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);
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<User> users;
private DataInputStream dataInputStream;
private DataOutputStream dataOutputStream;
private Socket client;
private boolean whetherRunning;
private String name;
public User(Socket client,CopyOnWriteArrayList<User> 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<User> users =new CopyOnWriteArrayList<User>();
public static void main(String[] args) throws IOException {
System.out.println("---------------服务器------------------");
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基础实现聊天室功能已完成。有问题随时评论,觉得有用的话记得点个赞哦!
在代码实例中学习知识,学和用兼备,想要长期学习的小伙伴记得关注哦!