`

Socket io聊天室模拟

    博客分类:
  • Java
 
阅读更多

Server

package com.bobo.org.mvc.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
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;




/**
 * Created by Bobo on 2015/11/19.
 */
public class Server {
    // 服务器端口
    private static final int SERVERPORT = 8888;
    // 客户端连接
    private static List<Socket> mClientList = new ArrayList<Socket>();
    // 线程池
    private ExecutorService mExecutorService;
    // serverSocket对象
    private ServerSocket mServerSocket;

    public static void main(String[] args) {
        new Server();
    }

    public Server() {
        try {
            // 设置服务器端口
            mServerSocket = new ServerSocket(SERVERPORT);
            // 创建一个线程池
            mExecutorService = Executors.newCachedThreadPool();
            System.out.println("start...");
            // 用来临时保存客户端连接的Socket对象
            Socket client = null;
            while(true) {
                // 接受客户度连接并添加到List中
                client = mServerSocket.accept();
                mClientList.add(client);
                mExecutorService.execute(new ThreadServer(client));
            }
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }

    // 每个客户端单独开启一个线程
    static class ThreadServer implements Runnable {
        private Socket mSocket;
        private BufferedReader mBufferedReader;
        private PrintWriter mPrintWriter;
        private String mStrMSG;

        public ThreadServer(Socket socket) throws IOException {
            this.mSocket = socket;
            // 设置读取套接字客户端发送流的编码格式
            mBufferedReader = new BufferedReader(new InputStreamReader(
                    socket.getInputStream(), "GB2312"));
            mStrMSG = "user:" + this.mSocket.getInetAddress() + " come total:"
                    + mClientList.size();
            sendMessage();
        }

        private void sendMessage() throws IOException {
            System.out.println(mStrMSG);
            for(Socket client : mClientList) {
                // 设置向套接字客户端写入流的编码格式
                mPrintWriter = new PrintWriter(new OutputStreamWriter(
                        client.getOutputStream(), "GB2312"), true);
                mPrintWriter.println(mStrMSG);
            }
        }

        public void run() {
            try {
                while((mStrMSG = mBufferedReader.readLine()) != null) {
                    if(mStrMSG.trim().equals("exit")) {
                        // 当一个客户端退出时
                        mClientList.remove(mSocket);
                        mBufferedReader.close();
                        mPrintWriter.close();
                        mStrMSG = "user:" + this.mSocket.getInetAddress()
                                + " exit tatal:" + mClientList.size();
                        mSocket.close();
                        sendMessage();
                        break;
                    }
                    else {
                        mStrMSG = mSocket.getInetAddress() + ":" + mStrMSG;
                        sendMessage();
                    }
                }
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }

    }
}

 

Client

package com.bobo.org.mvc.test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by Bobo on 2015/11/19.
 */


public class Client {
    private static final int PORT = 8888;
    // 线程池
    private static ExecutorService exec = Executors.newCachedThreadPool();

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

    public Client() {
        try {
            Socket socket = new Socket("127.0.0.1", PORT);
            exec.execute(new Sender(socket));
            // 设置读取套接字服务器返回流的编码格式
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    socket.getInputStream(), "GB2312"));
            String msg;
            while((msg = br.readLine()) != null) {
                System.out.println(msg);
            }
        }
        catch(Exception e) {
            System.out.println(e.getMessage());
        }
    }

    // 客户端线程获取控制台输入消息
    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(new OutputStreamWriter(
                        socket.getOutputStream(), "GB2312"), true);
                String msg;

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

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

 

分享到:
评论

相关推荐

    网页聊天室源码java-chat-socket.io:聊天socket.io

    jQuery写了一个低效的长轮询只有消息同步功能的小聊天室就已经耗尽心力,更不用说利用PHP的Socket接口写WebSocket的聊天室,那更是灾难。 刚才一口气说了一堆大家都困惑的术语,接下来等本菜鸟解释一下。 一般来说,...

    react-native-socket-io-example:用于实现移动聊天室的演示

    一个演示如何实现移动聊天室以及使用React Native和Socket.io为自己进行练习的示例。 我在谈到了更多 入门 首先,安装React Native,Socket.io和其他节点模块。 $ npm install 要启动服务器: $ npm run server ...

    IO-Games:使用Node.js和socket.io数据包构建的基于浏览器的IO游戏,以模仿客户端服务器环境。 客户连接被组织到独特的房间中,可以独立运行

    聊天室跟踪已连接用户的数量,播放器名称和颜色 用户可以切换聊天显示以显示或隐藏聊天 游戏特色: 分数跟踪实时显示 正在进行游戏时,当前房间的房间连接被禁用 房间状态和显示在每个回合结束时自动重置 用户断开...

    flackweb:使用Flask和SocketIO进行实时聊天的Python Web App

    项目二 使用Python和JavaScript“ #flackweb”进行Web编程 ... 用户将能够使用显示名称登录到您的网站,创建交流渠道(即聊天室),以及查看和加入现有渠道。 选择一个频道后,用户将能够实时相互发送和接收消息。

    Java源码包100个设计实例.zip

    iCHAT聊天室基于Java.rar IP定位器.rar J2ME优化压缩PNG文件.rar J2ME冒险游戏CASPER源代码.rar J2me月光战机游戏源码.rar J2ME黑白棋游戏手机版 v2.1完整源码.rar JasperReports 报表类库v3.5.rar Java 3DMenu 界面...

    Linux高性能服务器编程

    聊天室程序 9.6.1 客户端 9.6.2 服务器 9.7 IO复用的高级应用三:同时处理TCP和UDP服务 9.8 超级服务xinetd 9.8.1 xinetd配置文件 9.8.2 xinetd工作流程 第10章 信号 10.1 Linux信号概述 10.1.1 发送信号 ...

    mean-chatCollaboration:使用均值模块扫描仪ftp,电子邮件,国际象棋,用户和聊天

    聊天模块使用socket.io的即时消息系统,可以进行私人和公共对话,共享文件,富文本,可配置的通知声音,亵渎过滤器作为字典和XSS攻击。按组组织用户,移动组并对其进行分类,接受或拒绝朋友请求,视频会议,查看整个...

    java源码包---java 源码 大量 实例

    java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥  ...

    java源码包2

    java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,...

    java源码包3

    java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,...

    java源码包4

    java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示...

    JAVA上百实例源码以及开源项目源代码

    java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥  ...

    JAVA上百实例源码以及开源项目

    java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥  ...

    python入门到高级全栈工程师培训 第3期 附课件代码

    10 函数闭包模拟session 11 函数闭包装饰器运行流程 12 函数闭包带参数装饰器 第21章 01 查询功能 02 修改功能 03 程序的解耦 04 module模块和包的介绍 05 模块的执行以及__name__ 06 关于模块的介绍 07 time时间...

Global site tag (gtag.js) - Google Analytics