2015-06-25 101 views
0

我已經構建了一個託管(OWIN)的Windows窗體集線器,所以不僅充當代理,它將作爲客戶端,因爲我想要一個小窗口窗體,顯示其他客戶端連接。SignalR集線器Windows窗體 - 新手

我正在努力的位是主機客戶端「偵聽」以及如何記錄連接的機器。 我只想寫出消息到我的文本框

因此,這是我迄今爲止所做的,即時通訊在相同的窗體上運行client \ hub。

public partial class Form1 : Form 
{ 
    private IDisposable SignalR { get; set; } 
    private HubConnection hubConnection; 
    private IHubProxy chat; 
    const string URL = "http://localhost:8080"; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     Task.Run(() => StartServer()); 
     //Task.Run(() => RegisterServerConnection()); 
    } 

    private void StartServer() 
    { 
     try 
     { 
      SignalR = WebApp.Start(URL); 
     } 
     catch (TargetInvocationException) 
     { 

     } 
     this.Invoke((Action) (() => richTextBox1.AppendText("Server running on " + URL))); 


    } 

    private async void RegisterServerConnection() 
    { 
     hubConnection = new HubConnection(URL); 
     hubConnection.GroupsToken = "RoomA"; 

     chat = hubConnection.CreateHubProxy("chat"); 

     int timeout = 10000; 
     var task = hubConnection.Start(); 
     if (await Task.WhenAny(task, Task.Delay(timeout)) == task) 
     { 
      // await chat.Invoke<ConnectionModel>("clientConnected", connectionModel); 
      this.Invoke((Action)(() => richTextBox1.Text+="Connected")); 
      // this.Hide(); 
     } 
     else 
     { 
      this.Invoke((Action)(() => richTextBox1.AppendText("Unable to connect."))); 
     } 


     chat.Invoke<ChatMessage>("send", new ChatMessage() { Msg = "Host Running", GroupName = "Host" }); 
    } 

    private void btnGo_Click(object sender, EventArgs e) 
    { 
     RegisterServerConnection(); 
    } 



} 

[HubName("chat")] 
    public class ChatHub : Hub 
    { 
     public void SendMessage(string message) 
     { 
      var msg = String.Format(
       "{0}: {1}", Context.ConnectionId, message); 
      Clients.All.newMessage(msg); 
     } 

     public override Task OnConnected() 
     { 
      return base.OnConnected(); 
     } 



     public void Send(ChatMessage message) 
     { 
      // Call the addMessage method on all clients    
      Clients.All.addMessage(message.Msg); 
      Clients.Group(message.GroupName).newMessage("Group Message " + message.Msg); 
     } 
} 

回答

0

這是我做的,你可以嘗試:

  1. 創建在Form1具有以下結構的ArrayList:ConnectionId之外,登錄ID,ServerSideEncryptedLoginPW。

  2. 在連接期間(當任何客戶端在登錄之前連接時),使用(連接ID,空,空)將元素添加到數組列表。

  3. 在集線器中添加登錄功能。客戶端調用此函數後,更新該特定連接ID的數組列表中的LoginID和加密的LoginPW。 (檢查數據庫中的密碼,如果有的話)

  4. ondisconnected時,刪除該特定connectionID的數組列表中的元素。

  5. 對於集線器中的其他功能,客戶端必須提供LoginID和加密的密碼。

  6. 在Windows窗體中,當某些內容發生變化時,在arraylist中顯示值。沒有。的客戶連接,沒有。的客戶登錄,客戶登錄ID列表等。

這樣的事情!