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 CopyOnWriteArrayList5.服务器代码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); } } } }
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 CopyOnWriteArrayList6.客户端代码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(); } } }
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基础实现聊天室功能已完成。有问题随时评论,觉得有用的话记得点个赞哦! 在代码实例中学习知识,学和用兼备,想要长期学习的小伙伴记得关注哦!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)