/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.oic.connection;
import com.oic.client.OicCharacter;
import com.oic.net.WebSocketListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.eclipse.jetty.websocket.api.Session;
import org.json.simple.JSONObject;
/**
* サーバーに接続されているクライアントを管理する
*
* @author Morimoto
*/
public class Connections {
private static final List<WebSocketListener> userConnections = Collections.synchronizedList(new ArrayList<WebSocketListener>());
private static final Logger LOG = Logger.getLogger(Connections.class.getName());
/**
* クライアントを追加する
*
* @param websocketListener
*/
public static void addConnection(WebSocketListener websocketListener) {
synchronized (userConnections) {
userConnections.add(websocketListener);
}
}
public synchronized static void removeConnection(WebSocketListener webSocketListener) {
synchronized (userConnections) {
try {
webSocketListener.getSession().close();
} catch (IOException ex) {
Logger.getLogger(Connections.class.getName()).log(Level.WARNING, null, ex);
}
userConnections.remove(webSocketListener);
}
}
/**
* ユーザーの正当性を確認する 定期的に実行される
*/
public static synchronized void checkLive() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
JSONObject json = new JSONObject();
json.put("method", "live");
json.put("status", 0);
broadCastMessage(json);
try {
Thread.sleep(20000);
} catch (InterruptedException ex) {
}
}
}
}).start();
}
/**
* 接続されているユーザー全体にJSONを送信する
*
* @param json
*/
public static void broadCastMessage(JSONObject json) {
synchronized (userConnections) {
Session session;
try {
for(int i = 0; i < userConnections.size(); i++){
WebSocketListener websocket = userConnections.get(i);
session = websocket.getSession();
if (session.isOpen()) {
session.getRemote().sendString(json.toJSONString());
} else {
session.close();
userConnections.remove(i);
}
}
} catch (IOException e) {
LOG.log(Level.WARNING, "error {0}", e.toString());
}
}
}
public static void mapBroadCastMessage(JSONObject json, int mapid){
synchronized(userConnections){
try{
for(int i = 0; i < userConnections.size(); i++){
WebSocketListener webSocket = userConnections.get(i);
OicCharacter c = webSocket.getCharacter();
Session session = webSocket.getSession();
try{
if(c.getMap().getMapId() == mapid){
if (session.isOpen()) {
session.getRemote().sendString(json.toJSONString());
} else {
session.close();
userConnections.remove(webSocket);
}
}
}catch(NullPointerException e){
session.close();
userConnections.remove(webSocket);
}
}
}catch(IOException e){
e.printStackTrace();
}
}
}
}