用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. ubuntu下使用charles代理

    charles 最新的版本是3.10,但是这个版本还没有license可以用,所以使用3.9.2版本. 解压缩包就可以用了. 如果只是代理http请求,只要设置: Proxy -> Proxy ...

  2. sql: sybase与oracle中insert into select和select into的用法

    1. sybase与oracle中insert into select和select into的用法 http://wjlvivid.iteye.com/blog/1921679 Sybase 一.首 ...

  3. [课堂实践与项目]NavigationController与TabBarController的综合使用及易错点分析(包含消息提醒,app更新)

    陈述:我们在使用tabbarController的时候,我们总会和NavagationController联合起来.但是不联合的时候又是什么样的一种pool的情况呢?我们就单单的 TabBarCont ...

  4. HDU--杭电--3790--最短路径问题

    最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. Jenkins快速搭建持续集成

    基于Jenkins快速搭建持续集成环境 Jenkins+tortoisesvn+MSBuild做到持续集成 附Jenkins的使用:http://www.infoq.com/cn/articles/M ...

  6. 14.10.3 InnoDB Checkpoints InnoDB 检查点:

    14.10.3 InnoDB Checkpoints InnoDB 检查点: 你的log files 变的很大可能会降低磁盘性能在checkpointing的时候, 它通常设置设置log files总 ...

  7. Kendo UI开发教程(21): Kendo MVVM 数据绑定(十) Source

    Source绑定可以把ViewModel的值和由Kendo模板定义的目标元素绑定,如果ViewModel的值发生变化,被绑定的目标元素也随之发生变化.模板由属性data-template指定,它的值为 ...

  8. Delphi的DLL里如何实现定时器功能?

    一,首先引入“mmsystem”单元. 二,启动定时器: var MMTimerID: Integer; // 定时器ID MMTimerID := timeSetEvent(1000, 0, @Ti ...

  9. 让delphi程序不受WINDOWS日期格式的影响(使用SetLocaleInfo函数和Application.UpdateFormatSettings)

    如果WINDOWS系统的短日期格式为“yyyy/m/d”,执行下面的代码会报错:2013-01-29 00:00:00不是合法的日期procedure TFrmQuerySale.FormShow(S ...

  10. java大牛list

    1 Java的未来 Java能干什么.不能干什么,一开始就要搞清楚.这对于成为一个纯种的Java程序猿至关重要. 2 构建Java运行环境 Java运行在服务器,服务器都是Linux系统,对于真正程序 ...