从服务器发送消息到客户端c#

时间:2017-04-13 16:56:14

标签: c# server client

我在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);

        }
    }
}

有谁知道如何从服务器向客户端正确发送消息并在客户端中读取它?

2 个答案:

答案 0 :(得分:0)

如果您想使用当前使用的相同代码,则只需在&#上同时实现 Server Client 角色34;服务器"和你的"客户"电脑。然后当你想要" Server"要发送的计算机,它将充当客户端角色并发送给您的客户"计算机充当服务器角色。您将需要两台计算机监听另一台计算机的消息。我建议他们也在不同的端口上收听,这样你就不必修改代码了。根据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

答案 1 :(得分:0)

当服务器(TcpListener)接受来自客户端(TcpClient)的传入连接时,它将创建服务器端TcpClient。见MSDN TcpListener.AcceptTcpClient

所以你将拥有其中的两个:一个是你在客户端程序中创建的,另一个是由TcpListener自动创建的。

只需使用TcpClient.GetStream()在两者上获取底层网络流,您就可以使用NetworkStream.Read()和.Write()进行通信。那就是它。

为了测试和调试网络连接,我建议使用HWGroup Hercules和SysInternals TcpView。