2017-04-13 200 views
0

我在c#中創建了一個服務器客戶端應用程序。我設法從客戶端發送消息到服務器並閱讀它們,但我不知道如何從服務器發回消息到客戶端。從服務器發送消息到客戶端c#

這裏是我的服務器: enter image description here

namespace TCPSockets { 
    public partial class Form1 : Form { 

     TcpClient client = null; 
     TcpListener listener = null; 
     IPAddress ip = null; 
     int port = 1337; 

     Thread thClient = null; 
     Thread thListener = null; 


     NetworkStream dataStream = null; 


     public Form1() { 
      InitializeComponent(); 
      txt_ip.Text = "127.0.0.1"; 
      txt_port.Text = "1234"; 
     } 

     private void ListenForConnections() { 
      listener = new TcpListener(ip, port); 
      listener.Start(); 

      while (true) { 
       try { 
        client = listener.AcceptTcpClient(); 


        dataStream = client.GetStream(); 

        byte[] message = new byte[1024]; 
        dataStream.Read(message, 0, message.Length); 
        dataStream.Close(); 

        string strMessage = Encoding.UTF8.GetString(message); 
        MessageBox.Show("Server: I got message: " + strMessage); 
       } 

       catch (Exception ex) { 
        thListener.Join(); 
       } 
      } 
     } 




     private void start_server_Click(object sender, EventArgs e) 
     { 
      ip = IPAddress.Parse(txt_ip.Text); 
      port = Convert.ToInt32(txt_port.Text); 

      // nit => sicer vmesnik blokira, ko kličemo AcceptTcpClient() 
      thListener = new Thread(new ThreadStart(ListenForConnections)); 
      thListener.IsBackground = true; 
      thListener.Start(); 
     } 
    } 
} 

這裏是我的客戶: enter image description here

namespace TCPSockets { 
    public partial class Form1 : Form { 

     TcpClient client = null; 
     TcpListener listener = null; 
     IPAddress ip = null; 
     int port = 1337; 


     Thread thClient = null; 
     Thread thListener = null; 


     NetworkStream dataStream = null; 


     public Form1() { 
      InitializeComponent(); 
      txt_ip.Text = "127.0.0.1"; 
      txt_port.Text = "1234"; 
     } 


     private void SendPacket(object pClient) { 
      string message = txt_message.Text; 

      try { 
       client = (TcpClient)pClient; 
       client.Connect(ip, port); 

       dataStream = client.GetStream(); 
       byte[] strMessage = Encoding.UTF8.GetBytes(message); 
       dataStream.Write(strMessage, 0, strMessage.Length); 
       dataStream.Close(); 
       client.Close(); 
      } 
      catch (Exception ex) { 
       MessageBox.Show("Odjemalec: Pošiljanje ni bilo uspešno!"); 
      } 
     } 


     private void send_to_server_Click(object sender, EventArgs e) 
     { 
      ip = IPAddress.Parse(txt_ip.Text); 
      port = Convert.ToInt32(txt_port.Text); 

      client = new TcpClient(); 
      thClient = new Thread(new ParameterizedThreadStart(SendPacket)); 
      thClient.IsBackground = true; 
      thClient.Start(client); 

     } 
    } 
} 

沒有人知道如何正確地從服務器發送消息給客戶端和客戶端閱讀?

+0

首先客戶端必須連接到服務器。然後讓服務器寫入流,並從流中讀取客戶端。這與你已有的東西沒有多大區別。 – AlexDev

+0

請嘗試以下方法:listener.Server。發送 – jdweng

+0

您可以使用與從客戶端發送到服務器的方式完全相同的方式將消息從服​​務器發送到客戶端。只是不要關閉插座。確保你閱讀了可用的參考資料,包括MSDN示例和非常有用的[Winsock程序員常見問題](http://tangentsoft.net/wskfaq/)。它是Winsock程序員在.NET中編寫的,但.NET API只是Winsock上的一個薄層,並且其中的大多數建議仍然適用。 –

回答

0

如果你想使用你正在使用相同的代碼,你只需要實現兩個服務器客戶都你的「服務器」和你的「客戶」的計算機上角色。然後,當你想要的「服務器」的計算機發送,它將被作爲一個客戶作用,併發送至您的「客戶」計算機作爲服務器角色。您將需要兩臺計算機偵聽來自另一臺計算機的消息。我會建議他們也在不同的端口上聽,這樣你就不必修改你的代碼了。根據Tobias的評論,可能會導致更多的複雜性,這就是爲什麼我建議使用SignalR,但這不是這個問題的答案,它是一種替代方案。

如果你不介意使用一個新的代碼庫,一個解決方案,我會強烈建議探索是SignalR。 SignalR是一種允許「推送」通知的技術,可以讓您完成您非常容易完成的任務。這裏是一個偉大簡單的例子:

https://github.com/SignalR/Samples/tree/master/Samples_2.1.0/ConsoleClient

這將允許您調用郵件一樣簡單:

await _connection.Send(new { Type = "sendToMe", Content = "Hello World!" }); 

這是supported on many platforms,有很多的tutorials

這裏是對samples repository on GitHub的鏈接。另一種使用SignalR執行此操作的方法與OWIN自託管方法一起概述如下:SignalR Console app example

+0

兩個服務器和客戶端都不是一個好主意,除了雙方都需要能夠啓動通信。一臺服務器可以輕鬆地與一個客戶端交談,反之亦然。更好地做到這一點比把問題翻倍。 –

+0

好點Tobias。 –

0

當服務器(TcpListener)從客戶端(TcpClient)接受傳入連接時,它將創建服務器端TcpClient。請參閱MSDN TcpListener.AcceptTcpClient

因此,您將有2個:您在客戶端程序中創建的一個,以及由TcpListener自動創建的一個。

只需使用TcpClient.GetStream()獲取底層網絡流,您就可以使用NetworkStream.Read()和.Write()進行通信。而已。

進行測試和調試網絡連接,我建議使用HWGroup大力神和Sysinternals的套裝軟件的。

相關問題