tomcat 8 + java 7 의 WebSocket 채 팅 데모

5691 단어 websocket
tomcat 8 기반 웹 소켓 채 팅 데모
참고:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/chat/ChatAnnotation.java?view=markup
 
websocket - api 필요
            javax.websocket            javax.websocket-api            1.0            provided   
ChatAnnotation.java
package jmind.ws.tomcat.java7;

import java.io.IOException;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.atomic.AtomicInteger;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

import jmind.core.util.HTMLUtil;

/**
 * tomcat8 & java7
 * @author wbxie
 * 2013-11-9
 */
@ServerEndpoint(value = "/ws/chat")
public class ChatAnnotation {

    private static final String GUEST_PREFIX = "Guest";
    private static final AtomicInteger connectionIds = new AtomicInteger(0);
    private static final Set<ChatAnnotation> connections = new CopyOnWriteArraySet<ChatAnnotation>();

    private final String nickname;
    private Session session;

    public ChatAnnotation() {
        nickname = GUEST_PREFIX + connectionIds.getAndIncrement();
    }

    @OnOpen
    public void start(Session session) {
        this.session = session;
        connections.add(this);
        String message = String.format("* %s %s", nickname, "has joined.");
        broadcast(message);
    }

    @OnClose
    public void end() {
        connections.remove(this);
        String message = String.format("* %s %s", nickname, "has disconnected.");
        broadcast(message);
    }

    @OnMessage
    public void incoming(String message) {
        // Never trust the client
        String filteredMessage = String.format("%s: %s", nickname, HTMLUtil.cleanAll(message.toString()));
        broadcast(filteredMessage);
    }

    private static void broadcast(String msg) {
        for (ChatAnnotation client : connections) {
            try {
                client.session.getBasicRemote().sendText(msg);
            } catch (IOException e) {
                connections.remove(client);
                try {
                    client.session.close();
                } catch (IOException e1) {
                    // Ignore
                }
                String message = String.format("* %s %s", client.nickname, "has been disconnected.");
                broadcast(message);
            }
        }
    }
}

 
    tomcat xml 설정
catalina.sh
JAVA_OPTS="-server -Xmx4000M -Xms4000M -Xmn1200M -XX:PermSize=256m -XX:MaxPermSize=256m -Xss512K -XX:+ExplicitGCInvokesConcurrent -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128M -XX:+UseFastAccessorMethods -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0"
JAVA_OPTS="$JAVA_OPTS -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider"

 
server. xml 설정
     
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="500" minSpareThreads="10"/>

  nio

<Connector URIEncoding="UTF-8" executor="tomcatThreadPool"
  asyncTimeout="900000" maxConnections="40000"
  port="9079" protocol="org.apache.coyote.http11.Http11NioProtocol"  
  connectionTimeout="40000" acceptCount="200" maxThreads="20000"
    redirectPort="8443" />

 
    주, tomcat 8 nio 최대 연결 수 설정 사용 maxConnections 10000  참고:
http://tomcat.apache.org/tomcat-8.0-doc/config/http.html
 
  tomcat / conf / Catalina / localhost / ROOT. xml 편집
<?xml version="1.0" encoding="UTF-8"?>
<Context path="" docBase="/Users/wbxie/work/workspace/chineseall/jmind-websocket/target/jmind-websocket-2.0.2-SNAPSHOT"  reloadable="false" antiJARLocking="true" antiResourceLocking="false"></Context>

 
epoll 은 Liux 에서 시작 합 니 다:
JDK 6.0 과 JDK 5.0 update 9 의 nio 는 epoll (Linux 시스템 만 가능) 을 지원 하고 동시 다발 idle connection 에 큰 성능 을 향상 시 킬 수 있 습 니 다. 이것 이 바로 많은 네트워크 서버 응용 프로그램 에 필요 한 것 입 니 다.
사용 하 는 방법 은 다음 과 같 습 니 다.
-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider  
 

예 를 들 어 Linux 에서 실행 되 는 Tomcat 에서 NIO Connector 를 사용 하면 epoll 을 사용 하면 성능 향상 에 도움 이 됩 니 다.
Tomcat 에서 이 옵션 을 사용 하려 면 catalina. sh 의 시작 부분 에 다음 줄 을 추가 하 는 것 입 니 다.
CATALINA_OPTS='-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider'
  혹은
JAVA_OPTS="$JAVA_OPTS -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider"

좋은 웹페이지 즐겨찾기