java多线程:控制台聊天室
来源:优易学  2011-12-11 16:30:28   【优易学:中国教育考试门户网】   资料下载   IT书店

  package tf.thread;

  import java.io.BufferedReader;

  import java.io.IOException;

  import java.io.InputStreamReader;

  import java.io.PrintWriter;

  import java.net.ServerSocket;

  import java.net.Socket;

  import java.util.ArrayList;

  import java.util.List;

  import java.util.concurrent.ExecutorService;

  import java.util.concurrent.Executors;

  public class ChatServer {

  private static final int PORT = 8888; // 端口号

  private static List<Socket> list = new ArrayList<Socket>(); // 保存连接对象

  private ExecutorService exec;

  private ServerSocket server;

  public static void main(String[] args) {

  new ChatServer();

  }

  public ChatServer() {

  try {

  server = new ServerSocket(PORT);

  exec = Executors.newCachedThreadPool();

  System.out.println("服务器已启动!");

  Socket client = null;

  while (true) {

  client = server.accept(); // 接收客户连接

  list.add(client);

  exec.execute(new ChatTask(client));

  }

  } catch (IOException e) {

  e.printStackTrace();

  }

  }

  static class ChatTask implements Runnable {

  private Socket socket;

  private BufferedReader br;

  private PrintWriter pw;

  private String msg;

  public ChatTask(Socket socket) throws IOException {

  this.socket = socket;

  br = new BufferedReader(new InputStreamReader(socket

  .getInputStream()));

  msg = "【" + this.socket.getInetAddress() + "】进入聊天室!当前聊天室有【"

  + list.size() + "】人";

  sendMessage();

  }

  public void run() {

  try {

  while ((msg = br.readLine()) != null) {

  if (msg.trim().equals("bye")) {

  list.remove(socket);

  br.close();

  pw.close();

  msg = "【" + socket.getInetAddress() + "】离开聊天室!当前聊天室有【"

  + list.size() + "】人";

  socket.close();

  sendMessage();

  break;

  } else {

  msg = "【" + socket.getInetAddress() + "】说:" + msg;

  sendMessage();

  }

  }

  } catch (IOException e) {

  e.printStackTrace();

  }

  }

  /**

  * 群发消息给聊天室的所有人

  */

  private void sendMessage() throws IOException {

  System.out.println(msg);

  for (Socket client : list) {

  pw = new PrintWriter(client.getOutputStream(), true);

  pw.println(msg);

  }

  }

  }

  }

  ------------------------------------------------------------------------------------------------------------------------------

  package tf.thread;

  import java.io.BufferedReader;

  import java.io.InputStreamReader;

  import java.io.PrintWriter;

  import java.net.Socket;

  import java.util.concurrent.ExecutorService;

  import java.util.concurrent.Executors;

 

[1] [2] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训