`

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();
            }
        }
    }
}

 

分享到:
评论

相关推荐

    聊天室基础项目资料_socket聊天室_聊天室_java项目_socket_

    【标题】"聊天室基础项目资料_socket聊天室_聊天室_java项目_socket_" 涉及的是基于Java的Socket编程技术,用于实现一个TCP/IP通信的即时聊天室。在这个项目中,开发者将学习如何利用Java的Socket类来创建客户端和...

    Nodejs Socket io Mysql Demo

    在Web开发中,实时通信是现代应用程序不可或缺的一部分,尤其是对于构建交互式和动态应用,如聊天室、实时图表或者协作工具等。Node.js,一个基于Chrome V8引擎的JavaScript运行环境,因其异步非阻塞I/O特性,成为...

    socket.io源码

    - **实时聊天**:即时通讯应用,如聊天室、在线客服系统。 - **在线游戏**:需要实时交互的游戏,如多人在线对战游戏。 - **协作工具**:文档共享、实时编辑工具。 - **实时数据分析**:在数据流处理和监控场景...

    node+vuejs+mongodb 聊天室、websocket、socket.io、毕业设计(详细设计文档).zip

    在这个基于“Node.js + Vue.js + MongoDB”的聊天室毕业设计项目中,主要涵盖了现代Web开发中的几个关键技术和概念。以下是这个项目所涉及的核心知识点: 1. **Node.js**:Node.js是一个开放源代码、跨平台的...

    Java模拟聊天室.zip

    在本项目中,"Java模拟在线聊天室"是一个基于Java编程语言实现的简易聊天应用程序,旨在提供一个模拟的网络环境,使用户能够进行实时的文字交流。这个程序通常涉及到多线程、网络编程以及用户界面设计等多个Java核心...

    网页聊天室源码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 ...

    java多人聊天客户端,模拟聊天室

    在本项目中,"java多人聊天客户端,模拟聊天室"是一个使用Java编程语言实现的课程作业,旨在构建一个基本的在线聊天系统。这个系统允许多个用户登录并进行实时的文本交流,模拟了实际聊天室的功能。以下是这个项目...

    聊天室代码_java版

    首先,Java聊天室的实现通常涉及网络编程,这涉及到Java的Socket编程。Socket是网络通信的基础,它允许两个应用程序通过Internet进行通信。在Java中,`java.net.Socket` 和 `java.net.ServerSocket` 类是主要的接口...

    基于Java实现的局域网聊天室

    【基于Java实现的局域网聊天室】是一个适合初学者和进阶学习者的技术实践项目,旨在帮助开发者掌握网络编程和Java技术。这个聊天室应用允许在同一局域网内的用户进行实时通信,提供了基础的文本聊天功能。接下来,...

    Java即时通讯聊天室

    【Java即时通讯聊天室】是一个基于Java开发的小型局域网通信应用,旨在提供一个集登录注册、单聊、群聊、窗口抖动以及强制下线等多功能于一体的聊天平台,为用户创造更丰富的互动体验。 在即时通讯系统中,基础架构...

    Android例子源码Socket实现粗略的聊天室功能.zip源码资源下载

    10. **调试与测试**:为了确保聊天室功能的正确性,开发者需要进行各种测试,包括模拟不同网络环境、多用户同时在线等情况,以检测可能出现的问题并进行优化。 总之,这个源码资源为学习Android网络编程和Socket...

    JAVA 的5个实验报告和一个课程设计---聊天室

    4. **IO流**:在聊天室的设计中,输入/输出流(IO流)扮演着重要角色,用于读取用户输入并发送到服务器,或者接收服务器返回的消息。Java的IO库提供了丰富的类来支持文件操作和网络通信。 5. **网络编程**:Java的...

    java局域网聊天室文字文件传输

    【标题】:“java局域网聊天室文字文件传输”揭示了使用Java编程语言构建的局域网内聊天应用,该应用不仅支持用户间的基本文字交流,还具备文件传输能力,进一步增强了通信的功能性。 【描述】:“用java写的局域网...

    SimpleChat:基于Foundation,Node.js和Socket.io构建的聊天室应用程序

    "SimpleChat"是一款基于Foundation框架、Node.js服务器端技术和Socket.io实时通信库构建的简易聊天室应用程序。这个项目旨在提供一个交互式的、实时的在线聊天环境,让用户可以在多个浏览器窗口间进行即时通信。 ...

    java利用websocket实现多人聊天室(springmvc框架)

    在本文中,我们将深入探讨如何使用Java和Spring MVC框架实现一个基于WebSocket的多人聊天室。WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许实时双向通信,非常适合用于在线聊天应用。 首先,我们...

    聊天室源代码java版

    【标题】:“聊天室源代码java版”是一个Java编程实现的聊天室系统,它基于TCP协议进行通信。这个项目特别适合初学者学习网络编程和Java编程基础。 【描述】:这个Java聊天室源代码提供了从零开始构建一个聊天应用...

    使用推技术实现的聊天室

    在这个聊天室应用中,服务器会持续监听Socket连接,一旦检测到新的聊天消息,就立即构建响应并推送至相应客户端。为了实现高效率和低延迟,可以采用异步IO或多线程处理模型,确保服务器能够快速响应并发的请求。 ...

    功能比较完善的聊天室

    - **Socket.IO**:跨平台的实时应用库,支持WebSocket和其他多种 fallback 技术,确保在各种浏览器和移动设备上都能工作。 3. **数据库管理**: - **关系型数据库**(如MySQL、PostgreSQL)或**非关系型数据库**...

    Java聊天室程序(java).zip

    Java聊天室程序是一种基于Java编程语言实现的在线交互平台,允许用户通过网络进行实时通信。这个压缩包"Java聊天室程序(java).zip"很可能包含了所有必要的源代码、配置文件和其他资源,用于构建和运行一个简单的Java...

Global site tag (gtag.js) - Google Analytics