-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.js
More file actions
134 lines (115 loc) · 5.29 KB
/
app.js
File metadata and controls
134 lines (115 loc) · 5.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
var http = require("http"); //http 웹서버를 생성하기 위한 모듈
var fs = require("fs"); // 파일관련 처리를 하기 위한 모듈
var socketIo = require("socket.io"); //소켓서버를 생성 및 실행하기위한 모듈
var express = require("express");
var requestIP = require('request-ip')
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var xhr = new XMLHttpRequest();
var request = require("request");
var app =express();
const finding = 1;
const notFinding = 2;
const chating = 3;
var clients = []; //사용자를 저장/관리 하는 배열. 이 배열의 길이가 사용자(채팅 접속자)의 수.
var server = http.createServer(function(request,response){
//해당파일의 데이터를 읽고, 읽은 데이터를 클라이언트로 응답해줌.
fs.readFile("htmlPage.html","utf-8",function(error,data){
response.writeHead(200,{
"Content-Type":"text/html"
});
response.end(data);
})
}).listen(52273,function(){
console.log("server running");
}); //HTTP 웹서버를 생성
var io = socketIo.listen(server); //소켓서버를 생성 및 실행
//connection이벤트는 클라이언트가 소켓서버에 접속할때 발생하는 이벤트
//콜백함수에 있는 socket이라는 변수는 접속한 클라이언트와 소켓서버가 실시간 양방향 통신을 할 수 있도록 하는 소켓객체
io.sockets.on("connection",function(socket){
socket.on("nickNameCheck",function(data){
if(!data.name){
socket.emit("nullError","닉네임을 입력해주세요");
return ;
}
if(data.name){
const ip = socket.request.headers['x-forwarded-for'] || socket.request.connection.remoteAddress;
console.log(`접속한 ID:`, data.name);
console.log(`클라이언트 연결 성공 - 접속한 클라이언트IP: ${ip}`);
}
for(var a = 0; a<clients.length;a++){
if(clients[a].name == data.name){
socket.emit("sameNameError","동일한 닉네임이 존재합니다");
return ;
}
}
clients.push({
name:data.name, //사용자의 닉네임
client:socket, //사용자의 소켓
roomName:"", //사용자가 들어가 있는 방 이름
status:notFinding //사용자의 상태. notFinding(대화상대를 찾고있지 않는)상태로 초기화 시킴.
});
socket.name = data.name;
socket.emit("nickNameCheckComplete");
})
socket.on("randomChatFindClick",function(data){
for(var a = 0; a<clients.length; a++){
if(clients[a].name == data.name){
//해당사용자의 상태를 변경. 대화상대를 찾고있는(finding)상태로 변경
clients[a].status = finding;
socket.emit("randomChatFindClickComplete");
return ;
}
}
});
socket.on("randomChatFining", function(data){ //대화방을 찾고 있는 상대와 같은 방으로 이동시킨다.
for(var a =0; a<clients.length; a++){
if(clients[a].status == finding){
if(clients[a].name == data.name){
continue;
}else{
var roomName = new Date().getTime()+"";
clients[a].status = chating; //상대의 상태가 chating이 됨.
clients[a].roomName = roomName; //상대가 들어가있는 방 이름이 roomName
clients[a].client.join(roomName); //방으로 이동시킴
for(var a = 0; a<clients.length; a++){
if(clients[a].name == data.name){
clients[a].status = chating;
clients[a].roomName = roomName;
clients[a].client.join(roomName); //방으로 이동시킴
io.sockets.to(roomName).emit("randomChatFiningComplete",roomName);
return ;
}
}
}
}
}
});
socket.on("message",function(result){
io.sockets.to(result.roomName).emit("message", result.data);
});
socket.on("chatClosingBtn",function(data){
io.sockets.to(data.roomName).emit("chatEnd");
});
socket.on("ChatClosing",function(data){ //대화종료후 대화방에 들어가 있던 사용자들의 상태와,방이름을 리셋해줘야한다.
for(var a = 0; a<clients.length; a++){
if(clients[a].roomName == data.roomName){
clients[a].client.join(clients[a].client.id);
clients[a].roomName = "";
clients[a].status = notFinding;
}
}
});
socket.on("clientsCount",function(){
io.sockets.emit("clientsCount",clients.length)//자신을포함한 모든 사용자에게 메세지 전달
}); //실시간으로 접속자의 수를 보여주기 위함.
socket.on("disconnect",function(){
for(var a = 0; a<clients.length;a++){
if(clients[a].name == socket.name){
var aroom = clients[a].roomName;
clients.splice(a,1);
io.sockets.to(aroom).emit("discWhileChat");
}
}
});
});
module.exports = app;