import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Array;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URLEncoder;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Controller;
@Controller
@ServerEndpoint("/lms/chat")
public class lmsChatController extends Socket {
private static final List<Session> session = new ArrayList<Session>();
private static final HashMap<String, String[]> chatIdMap = new HashMap<String, String[]>(); // 접속자의 정보를 저장
@OnOpen
public void open(Session newUser) {
System.out.println("connected");
session.add(newUser);
System.out.println("현재 접속중인 유저 수 : " + session.size() + " : "+newUser.getId());
}
@OnMessage
public void getMsg(Session recieveSession, String msg) {
System.out.println("getMsg : " + msg +" : "+recieveSession.getId());
String[] arrChatIdMap;
// 0 명령
// 1 이름
// 2 학과명
// 3 학과코드
String[] arrMsg = msg.split(":,:");
System.out.println("정보 : " + arrMsg[0] +" : "+ arrMsg.length);
switch(arrMsg[0]) {
case "CONNECT":
chatIdMap.put(recieveSession.getId(), arrMsg);
arrChatIdMap = chatIdMap.get(recieveSession.getId());
System.out.println("첫 접속정보 : " + session.size() + " : "+chatIdMap.size() + " : "+recieveSession.getId());
connectlog(chatIdMap);
String sConnUserName ="";
for (Entry<String, String[]> entrySet : chatIdMap.entrySet()) {
String[] arrChatIdInfo= entrySet.getValue();
if(arrChatIdInfo[3].equals(arrChatIdMap[3])) {
sConnUserName+=arrChatIdInfo[1]+"+,+";
}
//System.out.println("AA : "+entrySet.getKey() + " : " + sConnUserName);
}
sConnUserName=sConnUserName.substring(0, sConnUserName.length()-3);
for (int i = 0; i < session.size(); i++) {
try {
if(session.get(i).isOpen()) {
System.out.println("접속자 정보 : " + i);
System.out.println("CON:,:"+sConnUserName+":,:"+arrChatIdMap[1]+"님이 접속하였습니다"+":,:"+arrChatIdMap[3]);
session.get(i).getBasicRemote().sendText("CON:,:"+sConnUserName+":,:"+arrChatIdMap[1]+"님이 접속하였습니다"+":,:"+arrChatIdMap[1]+":,:"+arrChatIdMap[2]+":,:"+arrChatIdMap[3]);
}
} catch (IOException e) {
e.printStackTrace();
}
}
break;
case "MESSAGE":
default:
arrChatIdMap = chatIdMap.get(recieveSession.getId());
for (int i = 0; i < session.size(); i++) {
if (! recieveSession.getId().equals(session.get(i).getId())) {
try {
if(session.get(i).isOpen()) {
session.get(i).getBasicRemote().sendText("U:,:"+arrChatIdMap[1]+":,:"+ msg+":,:"+arrChatIdMap[1]+":,:"+arrChatIdMap[2]+":,:"+arrChatIdMap[3] ); // 너가 보낸거
}
} catch (IOException e) {
e.printStackTrace();
}
} else {
try {
if(session.get(i).isOpen()) {
session.get(i).getBasicRemote().sendText("I:,:"+arrChatIdMap[1]+":,:"+ msg+":,:"+arrChatIdMap[1]+":,:"+arrChatIdMap[2]+":,:"+arrChatIdMap[3] ); // 내가 보낸거
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
break;
}
}
@OnClose
public void close(Session recieveSession) {
int sessionSize = session.size();
if (sessionSize != 0) {
try {
for (int i = 0; i < sessionSize; i++) {
// System.out.println("get : "+i+":"+recieveSession.getId() + " : "+session.size());
if (session.get(i).isOpen()) {
String[] arrChatIdMap = chatIdMap.get(recieveSession.getId());
//0 구분
//1 참여자 정보
//2 메시지
//3 학과번호
//4 학과명
String sConnUserName ="";
for (Entry<String, String[]> entrySet : chatIdMap.entrySet()) {
String[] arrChatIdInfo= entrySet.getValue();
System.out.println("AA : "+arrChatIdInfo[3] + " : " + arrChatIdMap[3]);
if(arrChatIdInfo[3].equals(arrChatIdMap[3])) {
sConnUserName+=arrChatIdInfo[1]+"+,+";
}
}
sConnUserName=sConnUserName.substring(0, sConnUserName.length()-3);
System.out.println("DCON:,:"+sConnUserName+":,:"+arrChatIdMap[1]+"님이 접속을 종료하였습니다"+":,:"+arrChatIdMap[3]+":,:"+arrChatIdMap[1]);
session.get(i).getBasicRemote().sendText("DCON:,:"+sConnUserName+":,:"+arrChatIdMap[1]+"님이 접속을 종료하였습니다"+":,:"+arrChatIdMap[1]+":,:"+arrChatIdMap[2]+":,:"+arrChatIdMap[3]);
}
}
List<Integer> nRemoveNum=new ArrayList<Integer>();
for (int i = 0; i < sessionSize; i++) {
System.out.println("close : "+i+":"+recieveSession.getId() + " : "+session.size());
if (! session.get(i).isOpen()) {
nRemoveNum.add(i);
chatIdMap.remove(recieveSession.getId());
}
}
for(int forInt:nRemoveNum) {
session.remove(forInt);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@OnError
public void error(Session recieveSession, Throwable error) {
System.out.println("error : "+error.toString()+" : "+recieveSession.getId());
if(chatIdMap.containsKey(recieveSession.getId()))
{
chatIdMap.remove(recieveSession.getId());
}
}
private void connectlog(HashMap<String, String[]> log) {
for (Entry<String, String[]> entrySet : log.entrySet()) {
String[] logtest= entrySet.getValue();
String bb = entrySet.getKey()+" = ";
for(String a:logtest) {
bb+=a+" : ";
}
System.out.println("AA : "+entrySet.getKey() + " : " + bb);
}
}
}