2017-10-17 1 views
2

nodejs의 ws websockets를 기반으로 멀티 룸 채팅 응용 프로그램을 만들고 있습니다. 하나의 chatroom을 만들 수 있지만 두 번째 룸을 만드는 동안 EADDRINUSE 오류가 발생합니다. 오류는 이미 첫 번째 방에서 사용중인 websocket 포트가 있기 때문입니다. 어떻게 다른 경로로 같은 포트에 두 번째 방을 만들 수 있습니까?다른 경로이지만 nodejs의 동일한 포트에서 websocket을 열 때 EADDRINUSE 오류가 발생했습니다.

var WebSocketServer = require('ws').Server; 
a = new WebSocketServer({port:8080, path:'/a'}), 
b = new WebSocketServer({port:8080, path:'/b'}); 

하면이 오류를 줄 : 오류 : 예를 들어

8080

감사를 EADDRINUSE를 듣고, 로빈

답변

0

여기서 문제는 각 WebSocketServer 업그레이드 이벤트에 대한 새로운 리스너를 추가한다는 것입니다 HTTP 서버에서 이벤트가 발생하면 모든 서버에서 handleUpgrade이 호출됩니다. 경로 유효성 검사가 경로 mismatch에서 연결을 종료했기 때문입니다.

는 둘 다에 쓰기로 귀하의 경우 something.com/a에 연결 먼저 b에 의해 a 설립 후 폐쇄 될 수 있기 때문에 좋은 생각이 방법은 웹 소켓 같은 포트에 다른 경로를 들어, 사용하고없는 그들 같은 소켓. 여러 웹 소켓 서버와 하나 개의 공유 HTTP 서버를하기 위해

는, 개발자는 다음과 같이 사용할 수 있습니다

const wss1 = new WebSocket.Server({ noServer: true }); 
const wss2 = new WebSocket.Server({ noServer: true }); 
const server = http.createServer(); 

server.on('upgrade', (request, socket, head) => { 
    const pathname = url.parse(request.url).pathname; 

    if (pathname === '/a') { 
    wss1.handleUpgrade(request, socket, head, (ws) => { 
     wss1.emit('connection', ws); 
    }); 
    } else if (pathname === '/b') { 
    wss2.handleUpgrade(request, socket, head, (ws) => { 
     wss2.emit('connection', ws); 
    }); 
    } else { 
    socket.destroy(); 
    } 
}); 
+0

다른 경로 (대화방)의 수는 동적 인 경우 무슨 일이 일어날 지. 이 예제에서 방금 두 개의 대화방을 언급했는데 동일한 웹 소켓 포트에 여러 경로가 있으면 어떻게됩니까? –

+0

귀하의 응용 프로그램에 대해 지원하는 대화방의 수와 유형을 항상 알기 때문에 그것이 실제 삶의 문제 (동적 대화방이 있음)가 될 수 있다고 생각하지 않습니다. 그리고 당신은 언제나'if' 나'switch'를 사용하여 그 연결을 방출 할 수 있습니다. 권리 ? 이해가 되니? –