将文本写入WINFORM中文本框的文本属性

时间:2016-11-16 13:28:26

标签: c# winforms

WinForms新手,但不是ASP.NET或C#。尝试制作客户端/服务器应用程序。成功从服务器上的客户端接收数据,但在服务器程序winform上显示它有麻烦。代码是:

服务器应用代码:

var column = '""Serial #""';
var updated = column.replace(/"+/g,""); //matches any quote

客户端应用代码:

using System;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;

namespace Server_App
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            IPEndPoint ep = new IPEndPoint(IPAddress.Loopback, 1234); //configure host
            TcpListenerEx listener = new TcpListenerEx(ep); //set host to listen
            if (!listener.Active)
            {
                listener.Start();
            }
            while (true)
            {
                const int byteSize = 1024 * 1024;
                byte[] message = new byte[byteSize];
                var s = listener.AcceptTcpClient();
                s.GetStream().Read(message, 0, byteSize); //obtaining network stream and receiving data through .Read()
                message = cleanMessage(message);                
                string g = System.Text.Encoding.UTF8.GetString(message);
                addMessage(g);    
            }
        }

        private void addMessage(string m)
        {
                this.textBox1.Text = textBox1.Text + Environment.NewLine + " >> " + m;
        }

        private byte[] cleanMessage(byte[] rawMessageByte)
        {
            byte[] cleanMessage = rawMessageByte.Where(b => b != 0).ToArray();
            return cleanMessage;
        }
    }
}

除了在服务器程序的Form1文本框中显示收到的数据外,一切都按计划进行。在调试时,我确认了在行using System; using System.Net.Sockets; using System.Threading.Tasks; using System.Windows.Forms; namespace ClientApp { public partial class ClientApp : Form { public ClientApp() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { var message = System.Text.Encoding.UTF8.GetBytes(txtFromClient.Text); using (var client = new TcpClient("127.0.0.1", 1234))//make connection with the host { NetworkStream stream = client.GetStream();/*obtain network stream*/ stream.Write(message, 0, message.Length); } } private void textBox1_Click(object sender, EventArgs e) { txtFromClient.Text = ""; } } } 的变量m中收到的正确值。唯一的问题是该值无法显示,因此在服务器程序的Form1上可见。

有人可以帮忙。

1 个答案:

答案 0 :(得分:1)

在@AdrianoRepetti的帮助和指导下,通过以下代码提供了对给定问题的解决方案:

using System;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Linq;

namespace Server_App
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.WorkerReportsProgress = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            IPEndPoint ep = new IPEndPoint(IPAddress.Loopback, 1234); //configure host
            if(!backgroundWorker1.IsBusy)
            {
                backgroundWorker1.RunWorkerAsync(ep); //called to start a process on the worker thread and send argument (listener) to our workerprocess.
            }
        }

        private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            IPEndPoint ep = e.Argument as IPEndPoint;
            TcpListenerEx listener = new TcpListenerEx(ep);
            if (!listener.Active)
            {
                listener.Start();
            }
            while (true)
            {
                try
                {
                    const int byteSize = 1024 * 1024;
                    byte[] message = new byte[byteSize];
                    using (var s = listener.AcceptTcpClient())
                    {
                        s.GetStream().Read(message, 0, byteSize);//obtaining network stream and receiving data through .Read()
                        message = cleanMessage(message);
                        string g = System.Text.Encoding.UTF8.GetString(message);
                        backgroundWorker1.ReportProgress(0, g);
                    }                    
                }
                catch (Exception ex)
                {
                     backgroundWorker1.ReportProgress(0, ex.Message);
                }
                finally
                {
                    listener.Stop();
                }
            }            
        }

        private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
        {
            textBox1.AppendText(Environment.NewLine + ">> " + e.UserState);
        }

        private byte[] cleanMessage(byte[] rawMessageByte)
        {
            byte[] cleanMessage = rawMessageByte.Where(b => b != 0).ToArray();
            return cleanMessage;
        }
    }
}

希望它有所帮助。