c# - 将数据从服务器发送回客户端

标签 c# winforms tcp tcpclient

我有一个从客户端向服务器发送消息的 TcpClient 应用程序。 代码如下:

clsServer.cs

public void server_start()
    {
        this.tcpListener = new TcpListener(new IPAddress(new Byte[] { 172, 16, 1, 55 }), 9999);
        this.listenThread = new Thread(new ThreadStart(ListenForClients));

        _rtb_Input.AppendText("Listening... Press any key to stop" + System.Environment.NewLine);
        this.listenThread.Start();
    }

    private void ListenForClients()
    {
        this.tcpListener.Start();
        while (true)
        {
            //blocks until a client has connected to the server
            client = this.tcpListener.AcceptTcpClient();

            //create a thread to handle communication
            //with connected client
            Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
            clientThread.Start(client);
        }
    }

    public event MessageReceivedHandler MessageReceived;
    private void HandleClientComm(object client)
    {
        TcpClient tcpClient = (TcpClient)client;
        NetworkStream clientStream = tcpClient.GetStream();

        byte[] message = new byte[4096];
        int bytesRead;

        while (true)
        {
            bytesRead = clientStream.Read(message, 0, 4096);

            //message has successfully been received
            ASCIIEncoding encoder = new ASCIIEncoding();
            string msg = encoder.GetString(message, 0, bytesRead);
            if (this.MessageReceived != null)
            {
                this.MessageReceived(msg);
            }
            //send message back select the message from the db
            byte[] buffer = encoder.GetBytes("Hello Client!");

            clientStream.Write(buffer, 0, buffer.Length);
            clientStream.Flush();
        }
        tcpClient.Close();
    }

frmClient.cs

public frmClient()
    {
        InitializeComponent();         
    }

    private void btn_ClientStart_Click(object sender, EventArgs e)
    {
        TcpClient client = new TcpClient();

        IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("172.16.1.55"), 9999);
        try
        {
            client.Connect(serverEndPoint);
            NetworkStream clientStream = client.GetStream();

            ASCIIEncoding encoder = new ASCIIEncoding();
            byte[] buffer = encoder.GetBytes(rtb_Outpot.Text);

            clientStream.Write(buffer, 0, buffer.Length);
            clientStream.Flush();
        }
        catch (Exception ex)
        {
            rtb_Outpot.AppendText(System.Environment.NewLine + "Failed To Connect to the Server" + System.Environment.NewLine);
        }
    }

frmServer.cs

private void btn_ServerStart_Click(object sender, EventArgs e)
    {
        btn_ServerStop.Enabled = true;
        btn_ServerStart.Enabled = false;
        server = new clsServer(rtb_Input);
        server.MessageReceived += new MessageReceivedHandler(Message_Received);
        server.server_start();
    }

    private void Message_Received(string message)
    {
        //update the display using invoke
        Invoke(new MessageReceivedHandler(PrintToScreen), new object[] { message });
    }

    private void PrintToScreen(string msg)
    {
        msg_counter++;
        rtb_Input.AppendText("msg no': " + msg_counter + System.Environment.NewLine + msg + System.Environment.NewLine);
    }

工作正常,当我从客户端向服务器发送消息时。 但是现在我可以想出一种方法将数据从服务器发送回客户端。 我是否也必须为客户端表单创建线程?

谢谢。

最佳答案

所发布的代码看起来更像是您正在尝试寻找一种方法来接收从服务器发送的消息。 clsServer.cs 中的代码已包含将数据发送到客户端所需的代码。

您的客户端代码只是缺少读取来自 clientStream 的响应的必要调用。如何在您的应用程序中实现取决于您的要求。就个人而言,我可能会将阅读任务转移到另一个线程。

关于c# - 将数据从服务器发送回客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9518129/

相关文章:

调用的目标已抛出 C# 异常

c# - Azure 服务总线 - 使用 OnMessage() 方法接收消息

c# - MVP 和丰富的用户界面

c# - 如何从 DataGridViewComboBoxColumn 获取选定值?

c# - 不需要的文本突出显示

c++ - 什么会导致我的数据包的字节顺序变得部分困惑?

通过 LAN 使用 TCP/IP 进行 Java 聊天

cocoa - 在 Cocoa 中通过 TCP 发送大文件的最佳方式

c# - .NET Core EntityFramework Identity - 更改 IdentityOptions(不在 Startup.cs 中)

c# - 枚举的变量总是被初始化?