Code Bye

socket聊天室

 

请问socket聊天室,如果我要做一个有N个房间 ,每个房间上限为10人的聊天室怎么做?并发量要高。这个每次客户接进一个房间时候,我需要根据房间号为他安排指定房间号的房间,请问怎么做?

楼主去网上下载一个socket聊天室的demo,自己在demo基础上再改改。
引用 1 楼 baohuan_love 的回复:

楼主去网上下载一个socket聊天室的demo,自己在demo基础上再改改。

找不到啊。没有符合的。没有带房间的

采用NIO来实现,以下是NIO简单示例;你可以通过windows的telnet localhost 8080连接测试.
package com.issrv.nioexample;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
public class NIOExample {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel ssc = ServerSocketChannel.open();
        ssc.configureBlocking(false);
        ssc.socket().bind(new InetSocketAddress(8080));
        Selector s = Selector.open();
        ssc.register(s , SelectionKey.OP_ACCEPT).attach(new Acceptable());
        //
        while(true){
            int keyCount = s.select();
            if(keyCount > 0){
                Iterator<SelectionKey> keys = s.selectedKeys().iterator();
                SelectionKey key = keys.next();
                keys.remove();
                if(!key.isValid()){
                    continue;
                }
                if(key.isAcceptable()){
                    System.out.println("isAcceptable:"+key.attachment());
                    ServerSocketChannel sschannel = (ServerSocketChannel)key.channel();
                    SocketChannel schannel = sschannel.accept();
                    schannel.configureBlocking(false);
                    schannel.register(s, SelectionKey.OP_WRITE).attach(new Writable());
                }
                if(key.isReadable()){
                    SocketChannel schannel = (SocketChannel)key.channel();
                    System.out.println("isReadable:"+key.attachment());
                    ByteBuffer bytes = ByteBuffer.allocate(4096);
                    int c = schannel.read(bytes);
                    //
                    if(c == -1){
                        System.out.println("Disconnection!");
                        key.channel().close();
                    }else{
                        System.out.println(new String(bytes.array(),"UTF-8"));
                    }
                }
                if(key.isValid() && key.isWritable()){
                    System.out.println("isWritable:"+key.attachment());
                    SocketChannel schannel = (SocketChannel)key.channel();
                    String text = "Welcome to NIO World!";
                    ByteBuffer bytes = ByteBuffer.wrap(text.getBytes());
                    schannel.write(bytes);
                    schannel.register(s, SelectionKey.OP_READ).attach(new Readable());
                }
            }
        }
    }
    
    static class Acceptable{}
    static class Readable{}
    static class Writable{}
}
每个房间初始化一个端口号,每次连接的时候根据端口号分配
引用 3 楼 littlebrain4solving 的回复:

采用NIO来实现,以下是NIO简单示例;你可以通过windows的telnet localhost 8080连接测试.

package com.issrv.nioexample;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
public class NIOExample {
    public static void main(String[] args) throws IOException {
        ServerSocketChannel ssc = ServerSocketChannel.open();
        ssc.configureBlocking(false);
        ssc.socket().bind(new InetSocketAddress(8080));
        Selector s = Selector.open();
        ssc.register(s , SelectionKey.OP_ACCEPT).attach(new Acceptable());
        //
        while(true){
            int keyCount = s.select();
            if(keyCount > 0){
                Iterator<SelectionKey> keys = s.selectedKeys().iterator();
                SelectionKey key = keys.next();
                keys.remove();
                if(!key.isValid()){
                    continue;
                }
                if(key.isAcceptable()){
                    System.out.println("isAcceptable:"+key.attachment());
                    ServerSocketChannel sschannel = (ServerSocketChannel)key.channel();
                    SocketChannel schannel = sschannel.accept();
                    schannel.configureBlocking(false);
                    schannel.register(s, SelectionKey.OP_WRITE).attach(new Writable());
                }
                if(key.isReadable()){
                    SocketChannel schannel = (SocketChannel)key.channel();
                    System.out.println("isReadable:"+key.attachment());
                    ByteBuffer bytes = ByteBuffer.allocate(4096);
                    int c = schannel.read(bytes);
                    //
                    if(c == -1){
                        System.out.println("Disconnection!");
                        key.channel().close();
                    }else{
                        System.out.println(new String(bytes.array(),"UTF-8"));
                    }
                }
                if(key.isValid() && key.isWritable()){
                    System.out.println("isWritable:"+key.attachment());
                    SocketChannel schannel = (SocketChannel)key.channel();
                    String text = "Welcome to NIO World!";
                    ByteBuffer bytes = ByteBuffer.wrap(text.getBytes());
                    schannel.write(bytes);
                    schannel.register(s, SelectionKey.OP_READ).attach(new Readable());
                }
            }
        }
    }
    
    static class Acceptable{}
    static class Readable{}
    static class Writable{}
}

那如何区别多个房间呢?

仅仅想做IM的话,下载openfire和spark,采用smack来开发XMPP协议聊天.
引用 6 楼 littlebrain4solving 的回复:

仅仅想做IM的话,下载openfire和spark,采用smack来开发XMPP协议聊天.

有资料吗?我有试过用这个,但是担心不够时间看源码,进行二次开发、真心急求。。openfire结合安卓的游戏房间里面的聊天室


40分
引用 7 楼 wojiaolinaaa 的回复:
Quote: 引用 6 楼 littlebrain4solving 的回复:

仅仅想做IM的话,下载openfire和spark,采用smack来开发XMPP协议聊天.

有资料吗?我有试过用这个,但是担心不够时间看源码,进行二次开发、真心急求。。openfire结合安卓的游戏房间里面的聊天室

网上Openfire和Spark的资料一大把啊,你可以先拿Spark登陆上去看,或者自己把spark源码下载下来放在eclipse运行调试着看,不难的.


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明socket聊天室