无法在格式文本框中看到字符串
Unable to see string in rich text box
我正在研究 c# winforms
。我的 main form
中有一个 rich textbox
。现在我正在使用 class HandleClient
,其中我正在使用一个调用函数的线程。在那个函数中,我为我的主窗体创建了一个新对象。我的代码如下
流量
首先,我通过用户传递一个端口号,然后单击按钮,我将收听它。为此,我有一个名为 Server
的 class
主窗体
port = Convert.ToInt32(tbPort.Text);
Server server = new Server(port);
if (btnListen.Text == "Listen")
{
btnListen.Text = "Close";
server.start();
}
以上对象创建完毕,调用start方法
服务器Class
public Server(int port)
{
this.port = port;
}
public void start()
{
listner = new TcpListener(new IPEndPoint(IPAddress.Any, port));
listner.Start();
listnerthread = new Thread(new ThreadStart(Listner));
listnerthread.Start();
}
public void Listner()
{
while (true)
{
try
{
TcpClient C = listner.AcceptTcpClient();
HandleClient client = new HandleClient();
client.startClient(C);
}
catch (Exception ex)
{
Console.WriteLine("Error in listner");
Console.WriteLine(ex.Message);
}
}
}
以上方法是监听端口。另外,我的句柄客户端函数也被调用。其中我试图将传入的字符串显示到富文本框
处理客户端
// Buffer to store the response bytes.
byte[] data = new byte[9999];
Thread comThread;
public void startClient(TcpClient inClientSocket)
{
this.clientsocket = inClientSocket;
comThread = new Thread(doChat);
comThread.Start();
}
private void doChat()
{
MainForm form = new MainForm();
while ((true))
{
try
{
// Read the first batch of the TcpServer response bytes.
NetworkStream stream = clientsocket.GetStream();
stream.ReadTimeout = 1000;
int bytes = stream.Read(data, 0, data.Length);
responseData = BitConverter.ToString(data,0,bytes);
form.rtBRecievedData.Text = responseData;
stream.Close();
clientsocket.Close();
}
catch (Exception ex)
{
Console.WriteLine(" >> " + ex.ToString());
comThread.Abort();
}
}
}
responseData
的值为01-01-01-01-00-01-00-19-F4-09-10-00-00-00-00-30-30-32-39-39-38-30-30-35-35-36-31-00-01-00-01-00-01-00-15-AA-10-00-00-00-00-30-30-32-39-39-38-30-30-35-35-36-31-12-00-12
现在的主要问题是 rich text box
上没有显示此字符串。我可能会遗漏一些我无法理解的东西。
非常感谢任何帮助。
form.rtBRecievedData.Text = responseData;
在循环中。
但是没有 Thread.Sleep() 方法。
form.rtBRecievedData.Text可以在下一轮循环执行时替换为responseData的空串
使用下面的代码,
form.rtBRecievedData.Text += responseData;
解决问题。
最好在循环内休眠以延迟读取端口。
您的问题是您试图在 MainForm
的新实例(您从未在其上调用 Show())而不是现有的 MainForm
,其中用户已经进入了端口。要解决此问题,您的 HandleClient
class 需要对现有表单的引用。
将字段添加到您的 Server
和 HandleClient
classes 并相应地调整您的构造函数:
public Server(int port, Form mainForm)
{
this.port = port;
this.mainForm = mainForm;
}
public HandleClient (Form mainForm)
{
this.mainForm = mainForm;
}
现在,在创建 Server
时,您可以使用 this
关键字传递对当前表单的引用,从而传递给 HandleClient
.
最后,您删除了创建新 MainForm
的行并改用该字段。
我正在研究 c# winforms
。我的 main form
中有一个 rich textbox
。现在我正在使用 class HandleClient
,其中我正在使用一个调用函数的线程。在那个函数中,我为我的主窗体创建了一个新对象。我的代码如下
流量
首先,我通过用户传递一个端口号,然后单击按钮,我将收听它。为此,我有一个名为 Server
主窗体
port = Convert.ToInt32(tbPort.Text);
Server server = new Server(port);
if (btnListen.Text == "Listen")
{
btnListen.Text = "Close";
server.start();
}
以上对象创建完毕,调用start方法
服务器Class
public Server(int port)
{
this.port = port;
}
public void start()
{
listner = new TcpListener(new IPEndPoint(IPAddress.Any, port));
listner.Start();
listnerthread = new Thread(new ThreadStart(Listner));
listnerthread.Start();
}
public void Listner()
{
while (true)
{
try
{
TcpClient C = listner.AcceptTcpClient();
HandleClient client = new HandleClient();
client.startClient(C);
}
catch (Exception ex)
{
Console.WriteLine("Error in listner");
Console.WriteLine(ex.Message);
}
}
}
以上方法是监听端口。另外,我的句柄客户端函数也被调用。其中我试图将传入的字符串显示到富文本框
处理客户端
// Buffer to store the response bytes.
byte[] data = new byte[9999];
Thread comThread;
public void startClient(TcpClient inClientSocket)
{
this.clientsocket = inClientSocket;
comThread = new Thread(doChat);
comThread.Start();
}
private void doChat()
{
MainForm form = new MainForm();
while ((true))
{
try
{
// Read the first batch of the TcpServer response bytes.
NetworkStream stream = clientsocket.GetStream();
stream.ReadTimeout = 1000;
int bytes = stream.Read(data, 0, data.Length);
responseData = BitConverter.ToString(data,0,bytes);
form.rtBRecievedData.Text = responseData;
stream.Close();
clientsocket.Close();
}
catch (Exception ex)
{
Console.WriteLine(" >> " + ex.ToString());
comThread.Abort();
}
}
}
responseData
的值为01-01-01-01-00-01-00-19-F4-09-10-00-00-00-00-30-30-32-39-39-38-30-30-35-35-36-31-00-01-00-01-00-01-00-15-AA-10-00-00-00-00-30-30-32-39-39-38-30-30-35-35-36-31-12-00-12
现在的主要问题是 rich text box
上没有显示此字符串。我可能会遗漏一些我无法理解的东西。
非常感谢任何帮助。
form.rtBRecievedData.Text = responseData;
在循环中。 但是没有 Thread.Sleep() 方法。
form.rtBRecievedData.Text可以在下一轮循环执行时替换为responseData的空串
使用下面的代码,
form.rtBRecievedData.Text += responseData;
解决问题。 最好在循环内休眠以延迟读取端口。
您的问题是您试图在 MainForm
的新实例(您从未在其上调用 Show())而不是现有的 MainForm
,其中用户已经进入了端口。要解决此问题,您的 HandleClient
class 需要对现有表单的引用。
将字段添加到您的 Server
和 HandleClient
classes 并相应地调整您的构造函数:
public Server(int port, Form mainForm)
{
this.port = port;
this.mainForm = mainForm;
}
public HandleClient (Form mainForm)
{
this.mainForm = mainForm;
}
现在,在创建 Server
时,您可以使用 this
关键字传递对当前表单的引用,从而传递给 HandleClient
.
最后,您删除了创建新 MainForm
的行并改用该字段。