java多线程控制台聊天室(转)

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

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可退出聊天室)

Java代码  

  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

时间: 2024-10-10 05:23:28

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

字节码学院之Java socket 控制台聊天室

学了个把月基础,终于写出了一个双工通信的控制台版本的聊天室了,废话不说啦,直接上代码:服务端代码 package com.zijiemaedu.socketdemo; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; /** * @author: Mr-zhang * @create: 2019-05-30 09:48 * @emall: [email

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

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827212.html 聊天室程序的结构图: 架构解释: Server服务器相当于一个中转站,Client客户端程序传送信息到服务器,服务器再把信息分发到其他客户端上,实现即时通信. 所需技术: 1:数据传输. 服务器与客户端之间的信息传递,都通过数据通道实现,有一个客户端连接到服务器,就有一条数据通道架设于该客户端和服务器之间. 这条数据通道通过Socket来实现:每个客户端通过一个socket与服务器建立

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

平时聊天都是在同一个窗口的,所以,这个窗口同时实现发送数据和接收数据,这时就需要多线程实现. 建立一个类: 把聊天的发送端和接收端放在同一个类,启动一个窗口 1 public class CharRoom { 2 3 public static void main(String[] args) throws IOException { 4 5 //创建socket发送对象和接收对象 6 DatagramSocket send = new DatagramSocket(); 7 DatagramS

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

1.UDP协议: 总结一下,今天学习的一点知识点! UDP也是一种通信协议,常被用来与TCP协议作比较!我们知道,在发送数据包的时候使用TCP协议比UDP协议安全,那么到底安全在哪里呢?怎么理解呢! 下面我说一下我的简单理解! 由于TCP协议是一种面向连接的协议,有三次挥手通信确认机制,且数据包没有代销限制,TCP协议确保在通信双方都收到对方确认信息的前提下,才开始为通信的双方传输信息(数据包)! 这样数据包的传输可以得到安全保障!所以简单的理解为安全的!当然一旦,出现网络问题,或者一些其他意外

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

1.简单的聊天室(控制台): 功能实现: 客户端和服务端的信息交流: 2.牵扯到的知识点: 这个我大概说一下,详细后面见代码! 1) 网络通讯的三要素 1. IP 2. 端口号. 3. 协议   2) InetAddress(IP类) 常用的方法: getLocalHost(); 获取本机的IP地址 getByName("IP或者主机名") 根据一个IP地址的字符串形式或者是一个主机名生成一个IP地址对象. (用于获取别人的IP地址对象) getHostAddress() 返回一个IP

哟哟哟,JAVA组装的聊天室,最简单的实现

太码多码码,总是多些感觉~~~ 打了快一个小时啊, 但看着一行一行的出来, 还是有成就感的~~:) VerySimpleChatServer.java import java.io.*; import java.net.*; import java.util.*; public class VerySimpleChatServer { ArrayList clientOutputStream; public class ClientHandler implements Runnable { Bu

java socket控制台版本聊天室程序源码下载

原文:java socket控制台版本聊天室程序源码下载 代码下载地址:http://www.zuidaima.com/share/1550463257578496.htm java socket控制台版本聊天室程序源码下载,学习的时候写的,适合学习java基础 java网络编程基础用 标签: java socket 控制台 聊天室 源码话题: 网络编程 java socket控制台版本聊天室程序源码下载,布布扣,bubuko.com

Java简单聊天室

实现Java简单的聊天室 所用主要知识:多线程+网络编程 效果如下图 /** * * @author Administrator * * 简单的多人聊天系统——重点:同时性,异步性 * 1.客户端:发送消息,并且接收消息 * 1.1 消息发送至服务器:服务器每次都将客户发过来的信息发送到每个客户端 * 1.2 接收消息:发送的同时也要接收消息,所以必须有两个线程,一个发送消息,一个接收消息 * 1.3 关于这两个线程:如果没有线程,接收和发送就是按顺序执行的了,那么是发送后接收还是接收后发送?或

[Java聊天室服务器]实战之八 读写循环(客户端)

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)