>웹 프론트엔드 >JS 튜토리얼 >Node.js_node.js에서 소켓을 사용하여 개인 및 공개 채팅방 만들기

Node.js_node.js에서 소켓을 사용하여 개인 및 공개 채팅방 만들기

WBOY
WBOY원래의
2016-05-16 15:31:051947검색

먼저 렌더링을 보여드리겠습니다.

이전 글에서는 Angular, Nodejs, Socket.io를 사용해 채팅방과 다자간 채팅방을 구축하는 방법을 소개했습니다. 이번 글에서는 계속해서 Node.js에서 소켓을 사용하는 방법을 소개합니다. Node.js를 사용하여 비공개 및 공개 채팅방을 만들 수 있습니다. 자세한 내용은 아래를 참조하세요.

nodejs의 애플리케이션 중 소켓이 더 뛰어나야 합니다. github에 수만 개의 별이 있어야 합니다. 전체 소켓의 사용을 용이하게 하기 위해서는 그 성공이 뒤떨어지지 않아야 합니다.

예시를 보려면 http://chat.lovewebgames.com/

을 클릭하세요.

소스코드 다운로드https://github.com/tianxiangbing/chat

제가 너무 가난해서 서버, 데이터베이스 모두 해외에서 공짜로 사용하고 있어서 접속 속도가 조금 느릴 수 있습니다.

먼저 제가 이해한 소켓.io에 대해 이야기하겠습니다. Websocket은 과거 통신을 모니터링하기 위해 포트 서비스를 여는 것과 비슷합니다. 따라서 현재 사이트 포트 80을 사용하여 소켓 서비스를 시작하거나 다음과 같은 다른 포트에 배치할 수 있습니다.

코드 복사 코드는 다음과 같습니다.

require('socket.io').listen(3000);

포트 3000을 모니터링하기 위한 것입니다. 제가 사용하는 무료 서버는 다른 포트를 열 수 있는 권한이 없기 때문에 계속 80을 사용하고 있습니다. 80은 이미 express에서 사용하고 있기 때문에 express를 사용할 때 넘겨줘야 합니다.

코드 복사 코드는 다음과 같습니다.

var 서버 = http.createServer(app);
var 소켓 = require('./socket/msg')(서버);

그런 다음 msg.js에 이렇게 썼습니다

코드 복사 코드는 다음과 같습니다.

var db = require('../db/mysql');
var sio = require('socket.io');
var IO = 함수(서버) {
var io = sio.listen(서버)

이것은 조화롭습니다. db는 mysql 연결을 생성하는 방법이며, 이 섹션에서는 포함되지 않으므로 생략합니다.

socket.io에서 작동하는 방식은 다음과 같습니다. 먼저 io 채널에 대한 연결을 만든 다음 Nodejs가 이벤트 중심으로 내부 소켓의 이벤트를 모니터링합니다. 코드는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.

io.on('연결', function(소켓) {
console.log('사용자가 연결되었습니다.');
​​​​ 소켓.on('disconnect', function() {
console.log('사용자 연결이 끊어졌습니다.');
        });
})

이때 사용자가 연결되어 있는 한 연결에 들어가고 해당 매개변수는 소켓입니다.

코드 복사 코드는 다음과 같습니다.

io.emit('채팅 메시지', {});

양식입니다. 하지만 우리는 여기서 비공개 채팅을 하고 있으므로 비공개로 채팅 중인 사람이 이를 사용하여 귀하의 소켓을 찾을 수 있도록 이 소켓 개체를 전역 세계에 임시로 저장해야 합니다. 이는 실제로 매우 복잡합니다. 여기의 chat은 완전한 point-to-point가 아니며, 여전히 서버를 통과하여 메시지가 서버로 전송됩니다. 그런 다음 서버는 메시지를 전달하려는 사람의 소켓 개체를 찾아서 그 사람에게 보냅니다. 이것이 전체 과정입니다. 여기서는 배열과 유사한 객체를 사용하여 저장합니다.

코드 복사 코드는 다음과 같습니다.

var 사용자 = {},
usocket = {};
소켓.on('사용자 조인', function(data) {
사용자[사용자 이름] = 사용자 이름;
usocket[사용자 이름] = 소켓;
})

로그인하려면 사용자 이름이 필요하기 때문에 사용자 이름을 유일한 식별자로 사용합니다(이것은 단지 예일 뿐이므로 사용자 이름이 중복된다는 얘기는 하지 마세요). 여기서 배열과 같은 형식을 사용하면 다음과 같은 이점이 있습니다. 굳이 루팅할 필요도 없이 빨리 찾을 수도 있어요. A에게 비공개 메시지를 보낼 때 먼저 이 uscoket에서 해당 메시지를 찾은 다음 Emit을 호출합니다.

function sendUserMsg(data) {
 if (data.to in usocket) {
 console.log('================')
 console.log('to' + data.to, data);
 usocket[data.to].emit('to' + data.to, data);
 usocket[data.user].emit('to' + data.user, data);
 console.log('================')
 }
}

여기서 두 번 내보내는 이유는 상대방에게 메시지를 보낼 때 나도 메시지를 받아서 표시해야 하기 때문입니다. 첫째, 인터페이스가 통일되었고, 채팅의 모든 내용이 서버에서 온다는 점, 둘째, 성공적으로 보냈음을 증명합니다.

그런 다음 클라이언트에서 청취할 때 내 사용자 이름을 사용하여 사용자 이름에 대한 이벤트 리스너도 설정했습니다.

socket.on('to' + user, function(data) {
 //console.log(data);
 formatMsg(data);
})

이렇게 하면 내가 보낸 메시지든 받은 메시지든 이 이벤트에 들어갑니다. 마지막으로, 사용자가 떠날 때 객체를 삭제하는 것을 잊지 마세요.

socket.on('disconnect', function() {
 console.log('disconnect')
 if (username) {
 counter--;
 delete users[username];
 delete usocket[username];
 if (home.name == username) {
  homeLeave(username);
 }
 sendmsg({
  type: 0,
  msg: "用户<b>" + username + "</b>离开聊天室",
  counter: counter,
  users: users
 })
 }
});

알겠습니다. 끝났습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.