2017-04-13 168 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的套装软件的。

相关问题