用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原生APP内分享

    Android原生APP内分享,可实现数据分享以及assets文件夹分享及私有文件分享 项目地址:https://github.com/json-pu/AndroidAppShare.git

  2. HTML+CSS - 前端设计的小技巧(持续更新......)

    2015年7月6日20:28:20 1.设置文字的居中,非控件内的. :text-alain:center 2.图片在ASP.NET中,可以直接拖放到界面,自动形成img控件. 3.CSS直接在全局样 ...

  3. perl 循环类选择器 ,爬取内容

    jrhmpt01:/root/lwp/0526# cat 0526.txt <div class="TXD_sy_title"><span class=" ...

  4. HTML5 input placeholder 颜色 改动

    David Murdoch:Chrome支持input=[type=text]占位文本属性,但下列CSS样式却不起作用: CSS input[placeholder], [placeholder], ...

  5. POJ2392 SpaceElevator [DP]

    题目大意:有一头奶牛要上太空,他有非常多种石头,每种石头的高度是hi,可是不能放到ai之上的高度.而且这样的石头有ci个 将这些石头叠加起来.问可以达到的最高高度. 解题思路:首先对数据进行升序排序. ...

  6. Swift - 系统声音服务的使用(播放声音,提醒,震动)

    1,系统声音服务介绍: 系统声音服务提供了一个Api,用于播放不超过30秒的声音.它支持的文件格式有限,具体的说只有CAF.AIF和使用PCM或IMA/ADPCM数据的WAV文件. 但此函数没有提供操 ...

  7. bonjour

    首先bonjour并非必须的,可是它的确非常方便,假设没有它我们须要指定ip地址进行局域网的传输,有了它就能够依据服务的详细的名称来选择服务,能够这样来理解bonjour就相当于hostname,我们 ...

  8. 使用JDBC调用数据库的存储过程

    本篇讲述如何使用JDBC来调用MySQL数据库中的存储过程.建议在学习如何使用JDBC调用存储过程前,请先了解如何在数据库中使用存储过程. 存储过程是指在数据库系统中,一组为了完成特定功能的SQL语句 ...

  9. asp.net检查验证字符串是否为纯数字方法小结

    原文  asp.net检查验证字符串是否为纯数字方法小结 在asp.net中验证字符串是不是为数字我们没有像php中那么多丰富的函数来直接使用,这里我整理了一些比较实例的验证字符串是否为纯数字方法代码 ...

  10. 重载(overload),覆盖/重写(override),隐藏(hide)

    写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖/重写(override),隐藏(hide).在早期的C++书籍中,常常把重载(overload)和覆盖(override)搞错 ...