Nodejs+socket.io+express+https 匿名Room

C#

プロジェクト

C#プロジェクト名CS_ScoketWindows用管理者アプリケーション
サーバー側server.jssocket通信管理用サーバー
クライアント側client.jsクライアント側制御アプリケーション

サーバー構成ファイルの概要

anonymous-chat/
│ └server.js
├─public/
│ ├─images/
│ │ └.jpeg
│ ├─js/
│ └─css/
├─views/
└index.ejs

接続処理

ブロック図

接続確認処理

client.js

接続確認情報の送信

socket.on('connect', function() { 
	var date = new Date();
	var rtn_str = getStringFromDate(date);
	// 接続
	var simpleData = {
		fromAddress: myid,
		toAddress: serverID,
		event:"",
		message:"Conect Anonymous client",
		timeStamp: rtn_str 
	};
        var messages_ = [];
	socket.emit('client_to_server_conect', JSON.stringify(messages_));      
});

接続許可受信処理

socket.on('admin_to_client_enable', function (message) {
 //ここに接続時の処理を記述
});

接続不許可受信処理

socket.on('admin_to_client_disable', function (message) {
 //ここに接続不許可時の処理を記述
});

server.js

socket.on('client_to_server_conect', function (receive_message) {
 var getJsonData = JSON.parse(receive_message);
 AddSocketID(getJsonData[0].fromAddress, socket.id);

  var simpleData = {
    fromAddress: getJsonData[0].fromAddress,
    toAddress:getJsonData[0].toAddress,
    event:"",
    message:"ID="+getJsonData[0].fromAddress+"さんの接続を許可しますか?",
    timeStamp: getDateTime()
  };
 var adminID_=FindSocketID(adminID);
 messages_ = [];
 messages_.push(simpleData);
 if(adminID_!=null)
 {
  io.to(adminID_).emit('server_to_admin_conect', JSON.stringify(messages_)); 
 }
})
2行目  JSON.parse() メソッドは文字列を JSON として解析し、文字列によって記述されている JavaScript の値やオブジェクトを構築します。
3行目接続要求を送信したユーザーのsocked.idを保存します。
5行目送信情報を定義します。
12行目room管理者のsocke.idを検索します。
17行目特定のユーザーのみ(socket.idで送信元のみに送信)

C#

this.socket.On("server_to_admin_conect", (jo) =>
{
  if (jo != null)
  {
    var booksByJson = JsonConvert.DeserializeObject<List<NewMessage>>(jo.ToString());
    this.RecvNewMessage(booksByJson[0]);
    //自動認証
    var message = new NewMessage()
    {
      FromAddress = booksByJson[0].ToAddress+ "admin",
      ToAddress = booksByJson[0].FromAddress,
      TimeStamp = DateTime.Now.ToString(),
      Event = "",
      Message = booksByJson[0].FromAddress + "さんに入室依頼を送りました。"
    };
    var src = new List<NewMessage> { message };
    string jsonString = JsonConvert.SerializeObject(src);
    this.socket.Emit("admin_to_client_enable", jsonString);
  }
});

入室処理

ブロック図

client.js

var simpleData = {
  fromAddress: myid,
  toAddress: serverID,
  event:"",
  message:roomid,
  timeStamp: rtn_str 
};
var messages_ = [];											//メッmessages_.push(simpleData);
socket.emit('client_to_server_join', JSON.stringify(messages_));   
messages_.length = 0;

simpleData = {fromAddress: myid,toAddress: serverID,event:"",message:"",timeStamp: rtn_str };
messages_.push(simpleData);
socket.emit('client_to_server_getall', JSON.stringify(messages_)); 
messages_.length = 0;

simpleData = {fromAddress: myid,toAddress: serverID,event:"",message:myid+"さんが入室しました。",timeStamp: rtn_str };
messages_.push(simpleData);
socket.emit('client_to_server_broadcast', JSON.stringify(messages_));  

server.js

socket.on('client_to_server_join', function (receive_message) {
  var getJsonData = JSON.parse(receive_message);
  room=getJsonData[0].message;
  socket.join(room);		
}
socket.on('client_to_server_getall', function (receive_message) {
  Chats.find()
    .then((messages) => {
      io.to(socket.id).emit('server_to_client', JSON.stringify(messages))
    })
    .catch((err) => {
    //エラー処理  
    })
})
socket.on('client_to_server_broadcast', function (receive_message) {
  var getJsonData = JSON.parse(receive_message);
  socket.broadcast.to(room).emit('server_to_client', receive_message);
  Chats.create(getJsonData[0]);
})

c#

this.socket.On("server_to_client", (jo) =>
{
  if (jo != null)
  {
    var list = JsonConvert.DeserializeObject<List<NewMessage>>(jo.ToString());
    foreach (var booksByJson in list)
    {
      this.RecvNewMessage(booksByJson);
    }
 }
});

動作画面

ユーザー側(ブラウザ表示画面)

管理者側(windows C# アプリケーション)

参考サイト

コメント