用java多线程实现一个控制台聊天室,呵呵,好玩! 
聊天室服务器端

  1. package tf.thread;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintWriter;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import java.util.concurrent.ExecutorService;
  11. import java.util.concurrent.Executors;
  12. public class ChatServer {
  13. private static final int PORT = 8888; // 端口号
  14. private static List<Socket> list = new ArrayList<Socket>(); // 保存连接对象
  15. private ExecutorService exec;
  16. private ServerSocket server;
  17. public static void main(String[] args) {
  18. new ChatServer();
  19. }
  20. public ChatServer() {
  21. try {
  22. server = new ServerSocket(PORT);
  23. exec = Executors.newCachedThreadPool();
  24. System.out.println("服务器已启动!");
  25. Socket client = null;
  26. while (true) {
  27. client = server.accept(); // 接收客户连接
  28. list.add(client);
  29. exec.execute(new ChatTask(client));
  30. }
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. static class ChatTask implements Runnable {
  36. private Socket socket;
  37. private BufferedReader br;
  38. private PrintWriter pw;
  39. private String msg;
  40. public ChatTask(Socket socket) throws IOException {
  41. this.socket = socket;
  42. br = new BufferedReader(new InputStreamReader(socket
  43. .getInputStream()));
  44. msg = "【" + this.socket.getInetAddress() + "】进入聊天室!当前聊天室有【"
  45. + list.size() + "】人";
  46. sendMessage();
  47. }
  48. public void run() {
  49. try {
  50. while ((msg = br.readLine()) != null) {
  51. if (msg.trim().equals("bye")) {
  52. list.remove(socket);
  53. br.close();
  54. pw.close();
  55. msg = "【" + socket.getInetAddress() + "】离开聊天室!当前聊天室有【"
  56. + list.size() + "】人";
  57. socket.close();
  58. sendMessage();
  59. break;
  60. } else {
  61. msg = "【" + socket.getInetAddress() + "】说:" + msg;
  62. sendMessage();
  63. }
  64. }
  65. } catch (IOException e) {
  66. e.printStackTrace();
  67. }
  68. }
  69. /**
  70. * 群发消息给聊天室的所有人
  71. */
  72. private void sendMessage() throws IOException {
  73. System.out.println(msg);
  74. for (Socket client : list) {
  75. pw = new PrintWriter(client.getOutputStream(), true);
  76. pw.println(msg);
  77. }
  78. }
  79. }
  80. }

聊天室客户端(输入bye可退出聊天室)

  1. package tf.thread;
  2. import java.io.BufferedReader;
  3. import java.io.InputStreamReader;
  4. import java.io.PrintWriter;
  5. import java.net.Socket;
  6. import java.util.concurrent.ExecutorService;
  7. import java.util.concurrent.Executors;
  8. public class ChatClient {
  9. private static final int PORT = 8888;
  10. private static ExecutorService exec = Executors.newCachedThreadPool();
  11. public static void main(String[] args) throws Exception {
  12. new ChatClient();
  13. }
  14. public ChatClient() {
  15. try {
  16. Socket socket = new Socket("192.168.1.120", PORT);
  17. exec.execute(new Sender(socket));
  18. System.out
  19. .println("【" + socket.getInetAddress() + "】您好,欢迎来到阿飞聊天室!");
  20. BufferedReader br = new BufferedReader(new InputStreamReader(socket
  21. .getInputStream()));
  22. String msg;
  23. while ((msg = br.readLine()) != null) {
  24. System.out.println(msg);
  25. }
  26. } catch (Exception e) {
  27. }
  28. }
  29. /**
  30. * 客户端线程获取控制台输入消息
  31. */
  32. static class Sender implements Runnable {
  33. private Socket socket;
  34. public Sender(Socket socket) {
  35. this.socket = socket;
  36. }
  37. public void run() {
  38. try {
  39. BufferedReader br = new BufferedReader(new InputStreamReader(
  40. System.in));
  41. PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
  42. String msg;
  43. while (true) {
  44. msg = br.readLine();
  45. pw.println(msg);
  46. if (msg.trim().equals("bye")) {
  47. pw.close();
  48. br.close();
  49. exec.shutdownNow();
  50. break;
  51. }
  52. }
  53. } catch (Exception e) {
  54. e.printStackTrace();
  55. }
  56. }
  57. }
  58. }
声明:ITeye文章版权属于作者,受法律保护。没有作者
 
mina 几句就搞定了的
 
 
http://www.iteye.com/topic/365764
 
 
 
 
 

java多线程控制台聊天室(转)的更多相关文章

  1. Java实现简易聊天室

    Java实现简易聊天室 在学习<Java从入门到精通>这本书,网络通信,基于TCP实现的简易聊天室,我这里对书中的代码略做了修改,做个记录. 这里先放一下运行效果图,代码放在最后. 运行效 ...

  2. 【Java】Socket+多线程实现控制台聊天室

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827212.html 聊天室程序的结构图: 架构解释: Server服务器相当于一个中转站,Client客户端 ...

  3. java 25 - 5 网络编程之多线程实现聊天室

    平时聊天都是在同一个窗口的,所以,这个窗口同时实现发送数据和接收数据,这时就需要多线程实现. 建立一个类: 把聊天的发送端和接收端放在同一个类,启动一个窗口 public class CharRoom ...

  4. Java基础知识强化之网络编程笔记05:UDP之多线程实现聊天室案例

    1. 通过多线程改进刚才的聊天程序,这样我就可以实现在一个窗口发送和接收数据了 2.  代码示例: (1)SendThread.java,如下: package com.himi.udpDemo2; ...

  5. 网络编程(学习整理)---2--(Udp)实现简单的控制台聊天室

    1.UDP协议: 总结一下,今天学习的一点知识点! UDP也是一种通信协议,常被用来与TCP协议作比较!我们知道,在发送数据包的时候使用TCP协议比UDP协议安全,那么到底安全在哪里呢?怎么理解呢! ...

  6. 网络编程(学习整理)---1--(Tcp)实现简单的控制台聊天室

    1.简单的聊天室(控制台): 功能实现: 客户端和服务端的信息交流: 2.牵扯到的知识点: 这个我大概说一下,详细后面见代码! 1) 网络通讯的三要素 1. IP 2. 端口号. 3. 协议   2) ...

  7. java bio 之聊天室

    最近在复习java io相关知识 ,发现很多细节之前没学习到位,原理也没吃透,只能感叹本人愚钝. 复习到bio,顺手写了个简单的聊天室功能,并和大家分享下. 服务端: package io.QQ聊天室 ...

  8. 基于Java的在线聊天室

    概述 Java socket编程,实现一个在线聊天室, 实现在线用户群聊,私聊,发送文件等功能. 详细 代码下载:http://www.demodashi.com/demo/13623.html 一. ...

  9. [Java小程序]聊天室——Socket和ServerSocket的使用

    这段小代码是因为担任Java助教给刚学习Java的本科大二的小学弟小学妹们指导,他们的实验作业就是编写一个Java聊天室客户端和服务器,为了避免出纰漏,自己事先写了一下. 客户端Ui代码: packa ...

随机推荐

  1. android 设置字体颜色、EditText自己主动输入转换成大写字母的多种方式

    在TextView上面设置某一个字的字体颜色为指定颜色时,能够通过java类SpannableString类和Html语言来实现. (一)SpannableString类方式 private void ...

  2. HDU 2045 不easy系列之(3)—— LELE的RPG难题

    思路: 1.若前n-1位涂的颜色是符合条件的,则因为首尾不同,再加入一位时,仅仅有1种方法:即s[n] = s[n-1] 2.若前n-1位组成的串不符合,再加入一位后合法.即由于首尾同样而引起的不合法 ...

  3. C#开发中遇到问题常问题

    1.C# decimal 赋值null decimal?是可空类型就是可以将值设置为Null,decimal 不能设置为null 2.var 定义变量 VAR 是3.5新出的一个定义变量的类型其实也就 ...

  4. 基于visual Studio2013解决C语言竞赛题之1061最大值和次最大值

       题目 解决代码及点评 /* 功能: 编写子函数, 求一维整型数组M[10]的最大值及次最大值(次最大值可能不存在). 主函数中输入10个整数, 然后调用上述子函数, 若次最大值存在, ...

  5. hdu 1540 Tunnel Warfare(线段树区间统计)

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  6. Swift - 跳跃吃苹果游戏开发(SpriteKit游戏开发)

    下面通过一个样例演示如何实现飞行道具的生成,以及道具碰撞拾取. 样例说明: 1,屏幕从右到左不断地生成苹果飞过来(苹果高度随机) 2,点击屏幕可以让熊猫跳跃 3,熊猫碰到苹果,苹果消失 运行效果: 样 ...

  7. Eclipse中提高Android SDK Manager下载速度方法

    在Windows-System32-drivers-ect目录下找到hosts文件 打开hosts文件(用记事本打开就可以),在文件以下填上一下内容: 203.208.46.146 www.googl ...

  8. spring mvc controller json数据

    项目中遇到个批处理,需要前台传递一个json格式对象数组,如下:var data={   "wos":[{"id":1,"satisfaction&q ...

  9. boost::thread之while(true)型线程终结方法

    我们的程序中经常会用到线程来执行某些异步操作,而有些时候我们的线程执行的函数是这个样子的: void ThreadBody() { while( true ) { std::cout << ...

  10. 记录路径dp-4713-Permutation

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4713 题目大意: 题意同HDU 3092这不过这题要输出路径. 解题思路: 思路同HDU 3092. ...