java控制台多人聊天室
菜鸟小星啦 人气:0多人聊天室就要用到网络以及多线程以及输入输出流的知识
多人聊天室就是多个人同时聊天,一个发一条信息所有人都是可以接收得到.
接下来我们捋清楚一下思路
在这里面服务器充当了一个转发的作用,服务器要做的事情是,得到客户写进缓冲流里面的信息,再把得到的信息再写进其他客户端的缓冲流里面,得到其他用户的缓冲流我们可以通过集合把用户的全部Socket对象写进集合里面,客户端把客户想要发送的信息写进缓冲流里,等待客户端发来的消息,一边等由一边发送消息,这个是属于并发的一个操作,所以读与写可以单独开个线程来进行发送消息.
下面是客户端的代码
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class Server { public static List<Socket> links = new ArrayList<>(); //用来存储客户端的socket对象 public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(6666); while(true){ Socket accept = serverSocket.accept(); links.add(accept); //只要有人连接就可以把他添加进socket对象集合里 ServerThread serverThread = new ServerThread(accept); //开启多线程,实现多人聊天的功能 serverThread.start(); } } //因为频繁的对输入输出流进行资源的关闭,所以写了个关闭资源的工具类 import java.io.Closeable; import java.io.IOException; public class CloseUtil { public static void close(Closeable... closeables){ for (Closeable closeable : closeables) { if (closeable!=null) { try { closeable.close(); } catch (IOException e) { e.printStackTrace(); } } } } } //多线程的代码如下 import java.io.*; import java.net.Socket; import java.util.List; public class ServerThread extends Thread { private Socket socket; private boolean flag = true; public ServerThread(String name, Socket socket) { super(name); this.socket = socket; } @Override public void run() { while(flag){ sendother(received()); //转发功能 } } private void sendother(String str) { List<Socket> links = Server.links; //因为在写客户端的时候是socket的集合是 静态的属性,所以可以直接通过类型.属性直接获得 for (Socket link : links) { if (link!=socket) send(str,link); //遍历整个对象转发给除当前对象的其他socket对象 } } private void send(String str,Socket socket) { BufferedWriter bw = null; try { OutputStream outputStream = socket.getOutputStream(); bw = new BufferedWriter(new OutputStreamWriter(outputStream)); bw.write(str); bw.newLine(); bw.flush(); } catch (IOException e) { flag = false; CloseUtil.close(bw,socket); } } private String received(){ BufferedReader br = null; try { InputStream inputStream = socket.getInputStream(); br = new BufferedReader(new InputStreamReader(inputStream)); return br.readLine(); } catch (IOException e) { flag = false; CloseUtil.close(br,socket); } return null; } }
下面是客户端的代码
import java.io.IOException; import java.net.Socket; import java.util.Scanner; public class Client { public static void main(String[] args) throws IOException { Scanner input = new Scanner(System.in); System.out.print("请输入您的名字:"); String name = input.next(); Socket socket = new Socket("127.0.0.1", 6666); //127.0.0.1是指的是本机 Send send = new Send(socket,name); //收发分别开两个线程,可以收发并发执行 Receive receive = new Receive("",socket); send.start(); receive.start(); } } //发线程 import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.util.Scanner; public class Send extends Thread { private Socket socket; private boolean flag = true; public Send(Socket socket,String name) { super(name); this.socket = socket; } @Override public void run() { while(flag){ send(); //一直循环保证客户可以一直发 } } private void send() { Scanner input = new Scanner(System.in); BufferedWriter bw= null; try { OutputStream outputStream = socket.getOutputStream(); bw = new BufferedWriter(new OutputStreamWriter(outputStream)); bw.write(this.getName()+"说:"+input.next()); // 当前线程名+在客户端在控制台输出的一并发给服务端 bw.newLine(); bw.flush(); } catch (IOException e) { flag = false; //出现异常的时候关闭循环,防止陷入死循环 CloseUtil.close(bw,socket); } } } //收线程 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Socket; public class Receive extends Thread { private Socket socket; private boolean flag = true; public Receive(String name, Socket socket) { super(name); this.socket = socket; } @Override public void run() { while (flag){ System.out.println(received()); //循环保证能一直接收服务器发来的消息 } } public String received(){ BufferedReader br =null; try { InputStream inputStream = socket.getInputStream(); br = new BufferedReader(new InputStreamReader(inputStream)); String line = br.readLine(); return this.getName()+line; } catch (IOException e) { flag = false; CloseUtil.close(br,socket); } return ""; } }
以上就是简易版聊天室,希望对大家的学习有所帮助,也希望大家多多支持。
加载全部内容