對WinForms不適用,但不適用於ASP.NET或C#。試圖製作客戶端/服務器應用程序。成功地從服務器上的客戶端接收數據,但在服務器程序winform上顯示它有麻煩。代碼如下:在WINFORM中將文本寫入文本框的文本屬性
服務器應用程序的代碼:
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 = "";
}
}
}
一切正在發生的事情。在調試時,我確認了this.textBox1.Text = textBox1.Text + Environment.NewLine + " >> " + m;
行的變量m
中收到的正確值。唯一的問題是,該值無法顯示,因此在服務器程序的Form1上可見。
有人可以請幫忙。
你的文本框支持多行嗎? –
@AlfieGoodacre對於服務器應用程序代碼的Form1上的textBox1,Multiline被設置爲'true'。是。 – Jogi
您的點擊處理程序在'while(true)'循環中接收消息。它永遠不會退出,然後控件永遠不會有機會刷新(並且應用程序將掛起)。將它移動到一個'BackgroundWorker'。另一個_minor_事物:你不需要同時調用Dispose()和Close(),它可以用'using'來簡化。我相信還有其他問題關於同樣的問題(關閉這個像笨蛋),但現在找不到它 –