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();
- }
- }
- }
- }
java多线程控制台聊天室(转)的更多相关文章
- Java实现简易聊天室
Java实现简易聊天室 在学习<Java从入门到精通>这本书,网络通信,基于TCP实现的简易聊天室,我这里对书中的代码略做了修改,做个记录. 这里先放一下运行效果图,代码放在最后. 运行效 ...
- 【Java】Socket+多线程实现控制台聊天室
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827212.html 聊天室程序的结构图: 架构解释: Server服务器相当于一个中转站,Client客户端 ...
- java 25 - 5 网络编程之多线程实现聊天室
平时聊天都是在同一个窗口的,所以,这个窗口同时实现发送数据和接收数据,这时就需要多线程实现. 建立一个类: 把聊天的发送端和接收端放在同一个类,启动一个窗口 public class CharRoom ...
- Java基础知识强化之网络编程笔记05:UDP之多线程实现聊天室案例
1. 通过多线程改进刚才的聊天程序,这样我就可以实现在一个窗口发送和接收数据了 2. 代码示例: (1)SendThread.java,如下: package com.himi.udpDemo2; ...
- 网络编程(学习整理)---2--(Udp)实现简单的控制台聊天室
1.UDP协议: 总结一下,今天学习的一点知识点! UDP也是一种通信协议,常被用来与TCP协议作比较!我们知道,在发送数据包的时候使用TCP协议比UDP协议安全,那么到底安全在哪里呢?怎么理解呢! ...
- 网络编程(学习整理)---1--(Tcp)实现简单的控制台聊天室
1.简单的聊天室(控制台): 功能实现: 客户端和服务端的信息交流: 2.牵扯到的知识点: 这个我大概说一下,详细后面见代码! 1) 网络通讯的三要素 1. IP 2. 端口号. 3. 协议 2) ...
- java bio 之聊天室
最近在复习java io相关知识 ,发现很多细节之前没学习到位,原理也没吃透,只能感叹本人愚钝. 复习到bio,顺手写了个简单的聊天室功能,并和大家分享下. 服务端: package io.QQ聊天室 ...
- 基于Java的在线聊天室
概述 Java socket编程,实现一个在线聊天室, 实现在线用户群聊,私聊,发送文件等功能. 详细 代码下载:http://www.demodashi.com/demo/13623.html 一. ...
- [Java小程序]聊天室——Socket和ServerSocket的使用
这段小代码是因为担任Java助教给刚学习Java的本科大二的小学弟小学妹们指导,他们的实验作业就是编写一个Java聊天室客户端和服务器,为了避免出纰漏,自己事先写了一下. 客户端Ui代码: packa ...
随机推荐
- Android原生APP内分享
Android原生APP内分享,可实现数据分享以及assets文件夹分享及私有文件分享 项目地址:https://github.com/json-pu/AndroidAppShare.git
- HTML+CSS - 前端设计的小技巧(持续更新......)
2015年7月6日20:28:20 1.设置文字的居中,非控件内的. :text-alain:center 2.图片在ASP.NET中,可以直接拖放到界面,自动形成img控件. 3.CSS直接在全局样 ...
- perl 循环类选择器 ,爬取内容
jrhmpt01:/root/lwp/0526# cat 0526.txt <div class="TXD_sy_title"><span class=" ...
- HTML5 input placeholder 颜色 改动
David Murdoch:Chrome支持input=[type=text]占位文本属性,但下列CSS样式却不起作用: CSS input[placeholder], [placeholder], ...
- POJ2392 SpaceElevator [DP]
题目大意:有一头奶牛要上太空,他有非常多种石头,每种石头的高度是hi,可是不能放到ai之上的高度.而且这样的石头有ci个 将这些石头叠加起来.问可以达到的最高高度. 解题思路:首先对数据进行升序排序. ...
- Swift - 系统声音服务的使用(播放声音,提醒,震动)
1,系统声音服务介绍: 系统声音服务提供了一个Api,用于播放不超过30秒的声音.它支持的文件格式有限,具体的说只有CAF.AIF和使用PCM或IMA/ADPCM数据的WAV文件. 但此函数没有提供操 ...
- bonjour
首先bonjour并非必须的,可是它的确非常方便,假设没有它我们须要指定ip地址进行局域网的传输,有了它就能够依据服务的详细的名称来选择服务,能够这样来理解bonjour就相当于hostname,我们 ...
- 使用JDBC调用数据库的存储过程
本篇讲述如何使用JDBC来调用MySQL数据库中的存储过程.建议在学习如何使用JDBC调用存储过程前,请先了解如何在数据库中使用存储过程. 存储过程是指在数据库系统中,一组为了完成特定功能的SQL语句 ...
- asp.net检查验证字符串是否为纯数字方法小结
原文 asp.net检查验证字符串是否为纯数字方法小结 在asp.net中验证字符串是不是为数字我们没有像php中那么多丰富的函数来直接使用,这里我整理了一些比较实例的验证字符串是否为纯数字方法代码 ...
- 重载(overload),覆盖/重写(override),隐藏(hide)
写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖/重写(override),隐藏(hide).在早期的C++书籍中,常常把重载(overload)和覆盖(override)搞错 ...