나는 내 직장이 클라이언트와 지원에 사용될 수 있도록 신호 대화 앱을 만들고있다. 그것들은 모두 정상적으로 작동하지만 클라이언트가 서로를 보지 못하게하고 온라인 지원 담당자 만 볼 필요가 있습니다. 마찬가지로 지원 끝에서 온라인 고객 만 볼 수 있으며 다른 지원 담당자는 볼 수 없습니다. 나는 이것을 봤고 구현하는 가장 좋은 방법은 groupA (지원자)의 사용자가 groupB (클라이언트)의 온라인 사용자 만 볼 수 있고 groupB의 사용자는 groupA의 온라인 사용자 만 볼 수 있도록 그룹을 사용하는 것임을 알았습니다. 내 자바 스크립트시그널러 그룹 구현하기
`# 지역 --- 방법 ---
public void Connect(string UserName, int UserID)
{
var id = Context.ConnectionId;
if (ConnectedUsers.Count(x => x.ConnectionId == id) == 0)
{
ConnectedUsers.Add(new UserDetail { ConnectionId = id, UserName = UserName, UserID = UserID });
}
UserDetail CurrentUser = ConnectedUsers.Where(u => u.ConnectionId == id).FirstOrDefault();
// send to caller
Clients.Caller.onConnected(CurrentUser.UserID.ToString(), CurrentUser.UserName, ConnectedUsers, CurrentMessage, CurrentUser.UserID);
// send to all except caller client
Clients.AllExcept(CurrentUser.ConnectionId).onNewUserConnected(CurrentUser.UserID.ToString(), CurrentUser.UserName, CurrentUser.UserID);
}
public void SendMessageToAll(string userName, string message)
{
// store last 100 messages in cache
//AddMessageinCache(userName, message);
// Broad cast message
//Clients.All.messageReceived(userName, message);
}
public void SendPrivateMessage(string toUserId, string message)
{
try
{
string fromconnectionid = Context.ConnectionId;
string strfromUserId = (ConnectedUsers.Where(u => u.ConnectionId == Context.ConnectionId).Select(u => u.UserID).FirstOrDefault()).ToString();
int _fromUserId = 0;
int.TryParse(strfromUserId, out _fromUserId);
int _toUserId = 0;
int.TryParse(toUserId, out _toUserId);
List<UserDetail> FromUsers = ConnectedUsers.Where(u => u.UserID == _fromUserId).ToList();
List<UserDetail> ToUsers = ConnectedUsers.Where(x => x.UserID == _toUserId).ToList();
if (FromUsers.Count != 0 && ToUsers.Count() != 0)
{
foreach (var ToUser in ToUsers)
{
// send to //Chat Title
Clients.Client(ToUser.ConnectionId).sendPrivateMessage(_fromUserId.ToString(), FromUsers[0].UserName, FromUsers[0].UserName, message);
}
foreach (var FromUser in FromUsers)
{
// send to caller user //Chat Title
Clients.Client(FromUser.ConnectionId).sendPrivateMessage(_toUserId.ToString(), FromUsers[0].UserName, ToUsers[0].UserName, message);
}
// send to caller user
//Clients.Caller.sendPrivateMessage(_toUserId.ToString(), FromUsers[0].UserName, message);
//ChatDB.Instance.SaveChatHistory(_fromUserId, _toUserId, message);
MessageDetail _MessageDeail = new MessageDetail { FromUserID = _fromUserId, FromUserName = FromUsers[0].UserName, ToUserID = _toUserId, ToUserName = ToUsers[0].UserName, Message = message };
AddMessageinCache(_MessageDeail);
}
}
catch { }
}
public void RequestLastMessage(int FromUserID, int ToUserID)
{
List<MessageDetail> CurrentChatMessages = (from u in CurrentMessage where ((u.FromUserID == FromUserID && u.ToUserID == ToUserID) || (u.FromUserID == ToUserID && u.ToUserID == FromUserID)) select u).ToList();
//send to caller user
Clients.Caller.GetLastMessages(ToUserID, CurrentChatMessages);
}
public void SendUserTypingRequest(string toUserId)
{
string strfromUserId = (ConnectedUsers.Where(u => u.ConnectionId == Context.ConnectionId).Select(u => u.UserID).FirstOrDefault()).ToString();
int _toUserId = 0;
int.TryParse(toUserId, out _toUserId);
List<UserDetail> ToUsers = ConnectedUsers.Where(x => x.UserID == _toUserId).ToList();
foreach (var ToUser in ToUsers)
{
// send to
Clients.Client(ToUser.ConnectionId).ReceiveTypingRequest(strfromUserId);
}
}
public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
{
var item = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
if (item != null)
{
ConnectedUsers.Remove(item);
if (ConnectedUsers.Where(u => u.UserID == item.UserID).Count() == 0)
{
var id = item.UserID.ToString();
Clients.All.onUserDisconnected(id, item.UserName);
}
}
return base.OnDisconnected(stopCalled);
}
#endregion
#region---private Messages---
private void AddMessageinCache(MessageDetail _MessageDetail)
{
CurrentMessage.Add(_MessageDetail);
if (CurrentMessage.Count > 100)
CurrentMessage.RemoveAt(0);
}
#endregion
public Task JoinGroup(string groupName)
{
return Groups.Add(Context.ConnectionId, groupName);
}
public Task LeaveGroup(string groupName)
{
return Groups.Remove(this.Context.ConnectionId, groupName);
}
}
}`:
이 내 허브 클래스 방송의 경우
$.connection.hub.start().done(function() {
registerEvents(chatHub);
chatHub.server.joinGroup("GroupA")
});
당신은 심지어 질문을하지 않은 :
이 코드 샘플이 SO 질문에서 찍은? 너는 무엇을 알기를 원하느냐? –
그룹 A가 그룹 B의 온라인 사용자를 조회하고 그 반대의 경우, 즉 다른 그룹의 사용자는 자신의 그룹에있는 사용자를 볼 수 없도록 그룹 2를 구현하는 방법을 알고 싶습니다. – Trev