`
reallyafei
  • 浏览: 98815 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java多线程控制台聊天室

    博客分类:
  • Java
阅读更多
用java多线程实现一个控制台聊天室,呵呵,好玩!

聊天室服务器端
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);
			}
		}
	}
}



聊天室客户端(输入bye可退出聊天室)
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;

public class ChatClient {
	private static final int PORT = 8888;
	private static ExecutorService exec = Executors.newCachedThreadPool();

	public static void main(String[] args) throws Exception {
		new ChatClient();
	}

	public ChatClient() {
		try {
			Socket socket = new Socket("192.168.1.120", PORT);
			exec.execute(new Sender(socket));
			System.out
					.println("【" + socket.getInetAddress() + "】您好,欢迎来到阿飞聊天室!");

			BufferedReader br = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			String msg;
			while ((msg = br.readLine()) != null) {
				System.out.println(msg);
			}
		} catch (Exception e) {

		}
	}

    /**
	 * 客户端线程获取控制台输入消息
	 */
	static class Sender implements Runnable {
		private Socket socket;

		public Sender(Socket socket) {
			this.socket = socket;
		}

		public void run() {
			try {
				BufferedReader br = new BufferedReader(new InputStreamReader(
						System.in));
				PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
				String msg;

				while (true) {
					msg = br.readLine();
					pw.println(msg);

					if (msg.trim().equals("bye")) {
						pw.close();
						br.close();
						exec.shutdownNow();
						break;
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

分享到:
评论
10 楼 panshunchang 2011-10-28  
 
        private void sendMessage() throws IOException {   
            System.out.println(msg);   
            for (Socket client : list) {   
                pw = new PrintWriter(client.getOutputStream(), true);   
                pw.print(msg);            
}   
        }   


使用这个个pw.print(msg)方法不能正常显示消息 
而使用这个pw.println(msg)却可以;  
9 楼 panshunchang 2011-10-28  
有个问题问问:
ChatServer 代码里,如果把

   /**  
         * 群发消息给聊天室的所有人  
         */  
        private void sendMessage() throws IOException {   
            System.out.println(msg);   
            for (Socket client : list) {   
                pw = new PrintWriter(client.getOutputStream(), true);   
                pw.print(msg); //使用个方法缺不能正常显示消息  //而使用这个pw.println(msg)却可以;   
            }   
        }   
8 楼 panshunchang 2011-10-28  
有个问题问问:
ChatServer 代码里,如果把
   /**  
         * 群发消息给聊天室的所有人  
         */  
        private void sendMessage() throws IOException {   
            System.out.println(msg);   
            for (Socket client : list) {   
                pw = new PrintWriter(client.getOutputStream(), true);   
                pw.print(msg); //使用个方法缺不能正常显示消息  //而使用这个pw.println(msg)却可以;   
            }   
        }   


7 楼 fjlyxx 2009-04-16  
呵呵,给你个建议.你可以这样写.当前一个线程拥有这个SOCKET,如果有请求那么这个拥有SOCKET的线程去现场池里面找一条可以用的线程并且把SOCKET给他,这样的话你就避免了线程的问题.如果要群发的话那么你应该考虑用消息通信机制,避免让消息去驱动连接.
6 楼 reallyafei 2009-04-15  
<div class="quote_title">finux 写道</div><div class="quote_div"><p>LZ,</p>
<pre name="code" class="java">private static List&lt;Socket&gt; list = new ArrayList&lt;Socket&gt;(); // 保存连接对象</pre>
<p>服务器端有多个线程都会读list,貌似并非线程安全...</p>
<p> </p></div><br/>恩,确实应该考虑同步问题,可以用
CopyOnWriteArrayList替换ArrayList
5 楼 finux 2009-04-15  
<p>LZ,</p>
<pre name="code" class="java">private static List&lt;Socket&gt; list = new ArrayList&lt;Socket&gt;(); // 保存连接对象</pre>
<p>服务器端有多个线程都会读list,貌似并非线程安全...</p>
<p> </p>
4 楼 reallyafei 2009-04-15  
lvp 写道
SOCKET 写一个聊天室也蛮有意思的!加油!

是挺有意思的,看你写的聊天室,很不错呢
向你学习!
3 楼 lvp 2009-04-15  
SOCKET 写一个聊天室也蛮有意思的!加油!
2 楼 reallyafei 2009-04-13  
fjlyxx 写道
mina 几句就搞定了的

哈哈,实现功能的代码确实没多少,我只是加了一些进入聊天室提醒或离开聊天室提醒以及清除资源的代码,所以显得多了。见笑了!
1 楼 fjlyxx 2009-04-12  
mina 几句就搞定了的

相关推荐

    java多线程实现一个控制台聊天室

    ### Java多线程实现控制台聊天室 #### 一、项目概述 本项目采用Java语言,利用多线程技术实现了一个简单的控制台聊天室。该聊天室具备基本的客户端与服务器端交互功能,用户可以通过控制台窗口进行文字聊天交流。 ...

    java多线程聊天室

    Java多线程聊天室是一个基于Java编程语言实现的实时通讯应用,它利用多线程技术来处理并发用户连接和通信。在这个项目中,有至少两个关键的类:Server和Control,它们分别扮演着服务器端和客户端控制台的角色。在...

    控制台的java聊天室

    使用多线程和Java IO包和Java net包在控制太实现简易的聊天室

    基于Java+socket实现多线程聊天室(控制台版+高分课设)

    基于Java+socket实现多线程聊天室(控制台版+高分课设)已获导师指导并通过的95分的高分期末大作业项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 该系统功能完善、界面美观、操作简单...

    Socket和多线程的聊天室

    本项目“Socket和多线程的聊天室”是一个基于控制台的简单聊天应用程序,允许用户通过命令行进行交互,实现私聊和群聊功能。 首先,让我们深入理解Socket。Socket是网络通信中的接口,可以看作是两台计算机之间的...

    基于TCP/IP网络编程的java控制台聊天室项目

    这个项目旨在利用Java的高级特性,如多线程、套接字编程等,构建一个简单的控制台聊天室,使得局域网内的设备即便在没有外部网络连接的情况下也能进行文字交流。 首先,TCP/IP协议是互联网通信的基础,它定义了数据...

    C++控制台局域网聊天室

    总的来说,这个“C++控制台局域网聊天室”项目涵盖了C++编程基础、网络编程基本概念、SOCKET接口的使用以及多线程处理等核心知识点,是一个不错的学习和实践平台。通过实际操作,开发者可以深入理解网络通信的原理,...

    基于Java Socket聊天室的控制台版本聊天源码

    在这个基于Java Socket的控制台版本聊天室源码中,我们可以深入理解如何构建一个简单的网络聊天应用。以下将详细讲解涉及的知识点: 1. **Socket基础**:Socket是Java网络编程的基础,它提供了两台机器间应用程序的...

    TCP多线程服务器-客户端聊天室(控制台版)

    基础的基于TCP协议多线程服务器-客户端聊天室,无图形化界面,纯控制台输入输出内容,实现聊天室群聊、私聊功能,服务端部分配备简单日志输出,注释齐全,适合开发者新手学习使用!详细内容请移步我的博客查看...

    利用Java写一段居于聊天室代码

    【Java实现聊天室代码详解】 Java作为一种广泛使用的编程语言,其强大的网络编程能力使得开发聊天室应用程序变得简单而高效。本篇文章将详细讲解如何利用Java编写一个基于GUI界面的服务器和客户端聊天程序。 首先...

    JAVA QQ控制台程序(学习版)

    接下来,我们谈谈Java多线程编程。在实现一个QQ聊天程序时,多线程是必不可少的。服务器端需要为每个客户端创建独立的线程,以便同时处理多个用户的连接请求。这样,当一个用户发送信息时,其他用户不会被阻塞,可以...

    简单聊天室java代码

    2. **Java I/O流**:在聊天室中,数据的读取(输入)和写入(输出)是通过I/O流完成的,如System.in用于读取用户输入,System.out.println()用于输出到控制台。 3. **Socket编程**:Java的Socket类是进行网络编程的...

    java简单聊天室的例子,带传文件功能

    Java简单聊天室是一个基本的网络...通过分析和实现这个Java简单聊天室,开发者可以深入理解网络编程的基本原理,同时掌握多线程、文件传输以及基础的GUI编程技巧。这个例子非常适合初学者作为学习Java网络编程的起点。

    基于Java+socket实现多线程聊天室-控制台版.rar

    在本项目"基于Java+socket实现多线程聊天室-控制台版"中,开发者创建了一个简单的、基于命令行界面的多人聊天应用。这个应用利用了Java编程语言以及Socket网络编程技术来实现实时的通信功能。以下是关于这个项目的...

    用java做一个聊天室

    【Java实现简单聊天室】 ...通过以上步骤和扩展,你可以创建一个基本的Java聊天室,进一步学习和实践网络编程、多线程以及Java的相关知识。在实际开发中,还需要根据具体需求进行更多的功能定制和性能优化。

    java socket 聊天室

    以上就是基于Java Socket实现的聊天室所涉及的主要技术点,这个项目对于学习网络编程、多线程和控制台应用开发具有很好的实践价值。通过实践这个项目,开发者能够深入理解网络通信的基础原理,提高解决实际问题的...

    JAVA程序的简单聊天室(初学者可以看看)

    本项目“JAVA程序的简单聊天室”就是面向初学者的一个实例,旨在帮助他们理解如何使用Java进行网络通信,以及基础的多线程编程。 1. **Java网络编程基础** - Java提供了Socket和ServerSocket类来实现客户端-服务器...

    java多人聊天室(服务器端和客户端)

    综上所述,这个Java多人聊天室项目涵盖了TCP网络编程、Java IO操作、多线程、文件操作、用户认证和简单的用户界面设计等多个知识点。通过实现这样一个项目,开发者可以深入理解网络通信的原理,并锻炼实际的编程技能...

    聊天室java代码实现

    在Java编程领域,实现一个聊天室是一项常见的任务,它涉及到网络编程、多线程和并发处理等核心概念。本项目提供了简单的Java代码实现,旨在帮助初学者理解和掌握这些技术。 首先,我们需要理解Java中的网络编程基础...

    JAVA聊天室小程序

    【JAVA聊天室小程序】是一个基于JAVA编程语言实现的简单应用程序,特别适合初学者学习和理解。这个程序没有图形用户界面(GUI),而是采用命令行或控制台交互方式,因此更侧重于网络通信和多线程等核心编程概念。 ...

Global site tag (gtag.js) - Google Analytics