ChatServer.java
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; public class ChatServer { private ArrayList<TongXinThread> list = new ArrayList<>(); public void start(){ //启动服务线程,循环accept new Thread(){ public void run() { try { ServerSocket ss = new ServerSocket(8000); System.out.println("服务已启动!"); while(true){ Socket s = ss.accept(); TongXinThread t = new TongXinThread(s); t.start(); synchronized (list) { list.add(t); } } } catch (Exception e) { System.out.println("无法启动服务,或服务已停止!"); } }; }.start(); } class TongXinThread extends Thread{ Socket s; BufferedReader in; PrintWriter out; public TongXinThread(Socket s) { this.s = s; } //发给当前客户端 public void send(String msg){ if(out != null){ out.println(msg); out.flush(); } } //发给所有客户端 public void sendAll(String msg){ synchronized (list) { for (TongXinThread t : list) { t.send(msg); } } } @Override public void run() { String name = null; try { in = new BufferedReader(new InputStreamReader(s.getInputStream(),"GBK")); out = new PrintWriter(new OutputStreamWriter(s.getOutputStream(),"GBK")); //先接收昵称 name = in.readLine(); //给当前客户端发送欢迎信息 send(name+"欢迎进入激情聊天室!!"); //群发一个上线消息 synchronized (list) { sendAll(name+"老司机进入了聊天室,在线老司机:"+list.size()); } //循环从客户端接收内容,群发; String line; while((line = in.readLine()) != null){ sendAll(name+"说:"+line); } } catch (Exception e) { e.printStackTrace(); } synchronized (list) { //当前客户端断开,把当前线程对象移除,this指自己 list.remove(this); //群发一个下线消息 sendAll(name+"老司机离开了聊天室,在线老司机:"+list.size()); } } } public static void main(String[] args) { ChatServer server = new ChatServer(); server.start(); } }
ChatClient.java
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.util.LinkedList; import java.util.Scanner; public class ChatClient { BufferedReader in; PrintWriter out; private LinkedList<String> list = new LinkedList<>(); private boolean flag = false; //用户正在输入的标记 public void start(){ try { //连接服务器 Socket s = new Socket("10.8.21.228",8000); in = new BufferedReader(new InputStreamReader(s.getInputStream(),"GBK")); out = new PrintWriter(new OutputStreamWriter(s.getOutputStream(),"GBK")); System.out.println("您的昵称:"); String name = new Scanner(System.in).nextLine(); out.println(name); out.flush(); //接收服务器的聊天内容 new Thread(){ public void run() { receive(); }; }.start(); //让用户输入聊天内容,并发送 new Thread(){ public void run() { input(); }; }.start(); //打印线程 new Thread(){ public void run() { print(); }; }.start(); } catch (Exception e) { System.out.println("无法连接服务器,或连接被断开!"); } } protected void print() { //从集合取出数据,从头部移除数据打印 while(true){ synchronized (list) { while(flag == true || list.size() == 0){ try { list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } String s = list.removeFirst(); System.out.println(s); } } } protected void receive() { try { String line; while((line = in.readLine()) != null){ // System.out.println(line); synchronized (list) { list.add(line); list.notifyAll(); //在集合上发通知 } } } catch (Exception e) { e.printStackTrace(); } System.out.println("已经断开连接!"); } protected void input() { System.out.println("嗯回车开始输入聊天内容:"); while(true){ new Scanner(System.in).nextLine(); flag = true; //正在输入 System.out.print("输入聊天内容:"); String s = new Scanner(System.in).nextLine(); out.println(s); out.flush(); flag = false; //通知正在等待的打印线程 synchronized (list) { list.notifyAll(); } } } public static void main(String[] args) { ChatClient c = new ChatClient(); c.start(); } }