게임 서버에 node.js를 사용하고 있습니다. 여기 Node.js를 사용하여 클라이언트 측 인터넷 연결을 감지하는 방법
는 ================================== 내 서버 스크립트var net = require('net');
var http = require('http');
var host = '192.168.1.77';
var portNum = 12345;//
function policy()
{
var xml = '<?xml version="1.0"?>\n<!DOCTYPE cross-domain-policy SYSTEM' +
'"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">\n<cross-domain-policy>\n';
xml += '<allow-access-from domain="*" to-ports="*"/>\n';
xml += '</cross-domain-policy>\n\0' + "\0";
return xml;
}
var server = net.createServer(function (stream)
{
stream.setEncoding('utf8');
stream.on('data', function (data) {
if (data == '<policy-file-request/>\0')
{
var x = policy();
stream.write(x);
var server_date = new Date();
var serv_sec = server_date.getSeconds();
return;
}
var comm = JSON.parse(data);
if (comm.action == "Join_Request" && comm.gameId =="game1") // join request getting from client
{
var reply0 = new Object();
reply0.message = "WaitRoom";
stream.write(JSON.stringify(reply0) + "\0");
}
});
stream.on('disconnect', function()
{
console.log("disconnect");
});
stream.on('close', function()
{
console.log("Close");
});
//stream.setNoDelay(true);
//stream.setKeepAlive(true, 200);
//stream.setTimeout(10, function(){
// console.log('timeout');
//});
stream.on('connect', function() {
console.log('check 2', stream.connected);
} );
stream.on('error', function() {
console.log("Error");
}); // close function
}); // ===== create server end
server.listen(portNum,host,{'heartbeat interval':1, 'heartbeat timeout' : 2} );
입니다 ========================================================================================================== ===========
클라이언트 측 스크립트
using UnityEngine;
using System.Collections;
using System;
using System.Xml;
using System.Linq;
using System.Threading;
using Boomlagoon.JSON;
using JsonFx.Json;
using System.Net.Sockets;
try
{
tcpClient.Connect (host,portNum);
serverStream = tcpClient.GetStream();
serverStream.Flush();
ThreadPool.QueueUserWorkItem(new WaitCallback(ReceiveFromServer));
isConnectionActive = true;
isReadyToJoinRoom = true;
connected = 1;
disconnected =0;
c_global.isClientConnectOn = false;
c_global.isClientDisconnectOn = false;
}
catch(ArgumentException l_exception)
{
c_global.isClientDisconnectOn = true;
isConnectionActive = false;
}
catch(SocketException l_exception)
{
c_global.isClientDisconnectOn = true;
isConnectionActive = false;
}
catch(Exception e)
{
c_global.isClientDisconnectOn = true;
isConnectionActive = false;
connected = 0;
disconnected =1;
}
public void ReceiveFromServer(object stateInfo) // Please call this function once
{
print (" $$$$$$$$$$$ ReceiveFromServer and isConnectionActive"+isConnectionActive);
while(isConnectionActive) // receive message continuously
{
try
{
byte [] inStream = new byte[tcpClient.ReceiveBufferSize];
serverStream.Read (inStream,0,(int)tcpClient.ReceiveBufferSize);
string returnData = System.Text.Encoding.UTF8.GetString(inStream);
print ("*^^^^^^^^^^* returnData"+returnData);
Decide_Action(returnData);
}
catch (Exception e)
{
c_global.isClientDisconnectOn = true;
}
}
}
public void Decide_Action(string returnData)
{
try
{
var r_Msg = JSONObject.Parse(returnData); // recieved message r_Msg
string msg = r_Msg.GetString("message") ;
print ("Message = "+msg);
switch(msg) // check the action to do
{
case "Players_List":
break;
}
}
catch (Exception e)
{
c_global.isClientDisconnectOn = true;
}
}
게임이 가깝거나 서버에 의해 감지 클라이언트 연결 해제, 게임에서 종료합니다. 그것은 "닫기"기능이고 "오류"기능은 그 시간을 호출합니다.
그러나 클라이언트 시스템이나 장치의 인터넷 연결이 끊어지면 그 "닫기"기능 또는 "오류"기능을 호출하지 않습니다.
하는 클라이언트 분리클라이언트 순 단선 Node.js를 서버에서 감지되지 않는 이런 종류의를 감지하는 방법.
누구든지 해결책을 알고 있다면 도와주세요.
timeout 이벤트를 사용하면 유휴 연결 또는 연결이 끊어진 연결을 구분할 수 없습니다. – Brad
위의 좋은 점과 좋은 대답. – Paul