Closed ghost closed 1 year ago
프록시 패스 설정이 잘못되었을 수도 있다는 말을 듣고 패스 설정 추가해봤으나 여전함. 소켓 접속 시도할 때 도메인 뒤에 :3000 붙여서 접속해봐도 동일한 결과인 것으로 봐서 포트 포워딩의 문제는 아닌 것 같다고 판단.
아래와 같이 테스트 서버 파일을 작성해서 실행해 봤습니다. => 한 파일에 서버실행, 소켓 서버 실행 코드를 모아서 작성.
const https = require('https');
const express = require('express');
const fs = require('fs');
const socketIo = require('socket.io');
const app = express();
const cors = require('cors');
require('dotenv').config()
app.get('/', (req, res) => {
res.send('Hello');
});
const options = {
ca: fs.readFileSync(
`/etc/letsencrypt/live/${process.env.DOMAIN}/fullchain.pem`
),
key: fs.readFileSync(
`/etc/letsencrypt/live/${process.env.DOMAIN}/privkey.pem`
),
cert: fs.readFileSync(
`/etc/letsencrypt/live/${process.env.DOMAIN}/cert.pem`
),
};
const httpsServer = https.createServer(options, app);
httpsServer.listen(3000);
const io = socketIo(httpsServer, cors({ origin: '*' }));
io.on('connection', (socket) => {
console.log('socket.js connected', socket.id);
});
(결과)
socket.js connected redi1udPWAW017tmAAAB
socket.js connected _GRi4FXEMHgUx5KNAAAD
https 서버 배포 자체는 문제가 없는 것 같고 import하는 순서의 문제인 것 같습니다.
- chat-socket.js -> chat.on(‘connection’, socket => {}) 내부의 각각의 socket.on 로직들 하나하나를 function 으로 만듦. -> function 예시
enterLobby(socket) {
// 로비 입장 메세지
socket.on('enterLobby', (nickname) => {
console.log(`${nickname} 로비 입장`);
const msg = `${nickname} 님이 입장하셨습니다.`;
const payload = {
name: nickname,
msg,
};
chat.sockets.emit('receiveLobbyMsg', payload);
});
-> 각 기능 function들을 ChatSocket이라는 클래스로 합치고, 모듈화하여 내보냄. -> module.exports = new ChatSocket()
- socket.js -> 모듈 임포트 & io 서버 정의
const cors = require('cors');
const socketIo = require('socket.io');
const { httpsServer } = require('./app');
const ChatSocket = require('./chat/chat-socket');
const io = socketIo(httpsServer, cors({ origin: '*' }));
-> chat-socket.js 에서 불러온 메소드들을 io.on(‘connection’, socket => {}) 내부에서 실행되도록 함.
io.on('connection', async (socket) => {
console.log('socket.js connected', socket.id);
ChatSocket.enterLobby(socket);
});
(결과)
0|server | socket.js connected 2FS7MTA4rpVllw7aAAAB
- chat-socket.js -> function으로 분리할 로직을 socket.on(‘enterLobby’, (nickname) => {} 내부의 로직으로 분리 -> function 예시
enterLobby4(socket, io, nickname, callback) {
console.log('소켓아이디::::::', socket.id);
console.log(`${nickname} 로비 입장`);
const msg = `${nickname} 님이 입장하셨습니다.`;
const payload = {
name: nickname,
msg,
};
io.sockets.emit('receiveLobbyMsg', payload);
callback();
}
- socket.js -> 모듈 require 부분 동일 -> 실행 코드
io.on('connection', async (socket) => {
console.log('socket.js connected', socket.id);
socket.on('enterLobby', async (nickname, callback) => {
ChatSocket.enterLobby4(socket, io, nickname, callback);
});
});
-server.js -> 아래 코드만 실행. 이외의 소켓 관련 require 모두 삭제
require('./src/socket');
(결과)
0|server | socket.js connected qhCRG-Kv359qFbHPAAAB
0|server | qhCRG-Kv359qFbHPAAAB
0|server | 미뇽 로비 입장
소켓 접속은 되는데 또 갑자기 io.on 내부의 socket.on 함수들을 인식 못하는 문제가 발생해서 해결해보려고 시도하다가 계속 안 돼서 아예 브랜치 새로 파서 다시 전부 수정해보니 갑자기 또 되네요... 이번엔 아예 클래스로 모듈화 하지도 않았는데도 되네요! 도대체 달라진 점이 없는데 이유를 모르겠네요 :sweat_smile:
한 일
Https 로 서버 배포 시도
< 현재 프로젝트의 서버 실행 flow >
- app.js : http 객체를 모듈로 내보냄
- socket.js : app.js에서 가져온 http 모듈을 인자로 받아서 구현된 socket 서버 코드를 모듈로 내보냄
- server.js : app.js에서 내보낸 http 객체 import : socket.js 에서 내보낸 모듈을 import하여 분리되어 있는 파일에서 작성된 socket 실행 모듈들 불러와서 바로 실행(require) : 가져온 http 모듈 실행
:point_down: :point_down: :point_down: :point_down: :point_down:
- app.js
- socket.js
- server.js
에러 내용
카카오 로그인 접속은 정상 동작하는데 소켓 접속 불가
조치 사항
socket을 사용한 이전 기수들의 프로젝트들을 찾아보며 서버 실행 방식을 살펴보았다. (일단 찾아지는 대로..)
(방법1) 7-D-1 멘도롱제주 : socket.js 에서 socket 관련 실행 코드를 모두 모아 하나의 함수로 (server를 인자로 받음) 만들어서 내보내고 그 함수를 서버에서 받아서 서버 실행과 동시에 실행하는 방법
(방법2) 8–F-7 THER_GENIUS_GAME - eventConnection.connection(io) : 현재 roomList를 정의한 후 io.on(‘connection’, ...) 실행 : 소켓 관련 모든 이벤트를 각기 다른 파일에서 클래스의 인스턴스 혹은 메소드 자체의 형식으로 내보낸 것들을 import하여 내부에서 실행 - socket.js : IO 라는 클래스 정의 : IO 내부의 constructor() 에서 this.server, this.connectServer(app) 을 정의 : this.server = https or http 로 서버 실행 로직 : connectServer = this.server를 인자로 받아서 eventConnection.connection(io)를 실행 : io = new Server(server) , {Server} = require(‘socket.io’) : module.exports = IO - app.js : const IO = require(“./socket”) : App 이라는 클래스 정의 : app = express() : constructor로 this.socketIO = new IO(app) : module.exports = new App().socketIO.server; - server.js : app.js에서 내보낸 모듈을 최종적으로 실행 : const app = require(‘./app’) : app.listen(~)
환경 설정
@kimhsno1 @tastekim @yunjin5450