我想基于HTML5 websocket创建html5 web多房间聊天。 但我需要一些帮助才能开始。
我想在c#中做服务器端代码,但我找不到任何教程如何在c#中与多个房间聊天websocket服务器。
是否有任何服务器已经在.net中实现,或者我可以更新到多房间聊天?
这是一个小项目,10个人的一个房间。你能帮帮我怎么开始吗?
非常感谢!
我准备了示例代码结构:
主服务器类:
class Program
{
// List of courses, which are currentli avalible ( REPRESENT CHAT ROOM)
protected static ConcurrentDictionary<Course, string> OnlineUsers = new ConcurrentDictionary<Course, string>();
static void Main(string[] args)
{
// Initialize the server on port 81, accept any IPs, and bind events.
var aServer = new WebSocketServer(81, IPAddress.Any)
{
OnReceive = OnReceive,
OnSend = OnSend,
OnConnected = OnConnect,
OnDisconnect = OnDisconnect,
TimeOut = new TimeSpan(0, 5, 0)
};
aServer.Start();
// Accept commands on the console and keep it alive
var command = string.Empty;
while (command != "exit")
{
command = Console.ReadLine();
}
aServer.Stop();
}
// event when the clients connect to server
// Server send to client list of Lessons which are avalible, after
private static void OnConnect(UserContext context)
{
throw new NotImplementedException();
}
// event whent the client, want to disconnect from server
private static void OnDisconnect(UserContext context)
{
throw new NotImplementedException();
}
// event, when client is sending some data
private static void OnSend(UserContext context)
{
throw new NotImplementedException();
}
// event, when server receive data from client
// client choose which room want to join and, we add cleint to list of lessons which he choose
// another method ... Register, Rename, LogOff ...
private static void OnReceive(UserContext context)
{
throw new NotImplementedException();
}
}
课程类:(ROOMS)
class Course
{
// Every course has list of active users
protected static ConcurrentDictionary<User, string> OnlineUsers = new ConcurrentDictionary<User, string>();
// Name of course
public String CourseName { get; set; }
}
用户类:
class User
{
// Name of User
public string Name = String.Empty;
// UserContext - Contains data we will export to the Event Delegates.
public UserContext Context { get; set; }
}
我的目的是好的结构吗?我有很多课程(房间),一个老师,一个课程可以是20个学生的例子。在一个课程中,学生可以使用聊天(网络插座)和绘图板与techer交谈..
答案 0 :(得分:1)
我将如何构建对象层次结构:
聊天服务器应该有一个ChatRoom
的列表。
每个ChatRoom
都应该有一个ChatUser
s列表。
每个ChatUser
应该有一个或没有ChatRoom
和一个出站套接字。
(这假设用户一次只能在一个房间。允许多个房间会让事情变得更复杂)
选择房间的方式如下:
当客户端连接时,会创建ChatUser
。服务器做的第一件事就是将聊天室列表发送给用户。然后,客户端以其要加入的聊天室的名称进行响应。当该名称的聊天室不存在时,会创建该聊天室并将其添加到全局房间列表中。
然后将客户端添加到房间,并在客户端上设置房间。
聊天的效果如何:
当用户的套接字收到聊天消息时,它应该在用户当前所在的房间内调用SendToAllClients
方法(当房间为空时,它应该向用户返回一条错误消息,告知用户他们必须先加入一个房间。)
会议室的SendToAll
方法应该呼叫其用户列表中所有用户的SendToClient
。
然后,该类的SendToClient
方法会将聊天消息发送给客户端。
如何针对每个用户的多个聊天室展开
要允许客户端一次加入多个聊天室并在其中分别进行对话,客户端必须能够:
这意味着客户端要执行的操作无法从当前所处的状态中推断出来。您需要将此信息添加到用户的消息中。例如,您可以将此作为前缀。像
!list
请求房间列表
!join:asdf
加入/创建房间asdf
_asdf:Hello
将消息Hello发送到房间asdf。
来自服务器的消息应该具有类似的前缀,以便客户端可以推断出消息是房间列表还是聊天消息,以及它来自哪个房间。
答案 1 :(得分:0)
您应该尝试查看SignalR for ASP.NET(例如:jabbr.net/)。这可能更有帮助和方便。