0

我正在尝试在 WPF 中实现一个基本的 TCP 客户端。我已经设法使用 Windows 窗体来做到这一点,但无法让它在 WPF 中工作。我试着回到最基本的东西,一点一点地添加东西。这是为了连接到输出单行代码的 arduino。我可以通过 telnet 成功连接到它,所以问题出在我的代码上。

这是我到目前为止所拥有的:

public partial class MainWindow : Window
{
    private TcpClient tcp;
    private StreamWriter SwSender;
    private StreamReader SrReciever;
    private Thread thrMessaging;
    private delegate void UpdateLogCallBack(string strMessage);

    public MainWindow()
    {
        InitializeComponent();
    }

    private void btn_Connect_Click(object sender, RoutedEventArgs e)
    {
        TcpClient tcp = new TcpClient();
        txt_Log.AppendText("connecting");
        tcp.Connect(IPAddress.Parse("192.168.137.1"), 2000);
        txt_Log.AppendText("Connected");
        thrMessaging = new Thread(new ThreadStart(ReceiveMessages));
        thrMessaging.Start();

    }
    private void ReceiveMessages()
    {
        SrReciever = new StreamReader(tcp.GetStream());
        while (true)
        {
            string response = SrReciever.ReadLine();
            txt_Log.Dispatcher.Invoke(new UpdateLogCallBack(this.UpdateLog), new object[] { response });
        }
    }
    private void UpdateLog(string strMessage)
    {
        txt_Log.AppendText(strMessage);
    }
}

}

运行它会在接收消息方法中给我一个错误。它说错误与“SrReciever = new StreamReader(tcp.GetStream());”有关 说它是 NullReferenceException,对象引用未设置为对象的实例。

我不是最擅长编程的,所以如果有一个在 WPF 中工作的 TCP 客户端的示例,那将非常有帮助。

谢谢尼克

4

1 回答 1

4

这仅仅是因为您在这里创建了一个作用域变量:

private void btn_Connect_Click(object sender, RoutedEventArgs e)
{
    //TcpClient tcp = new TcpClient();
    //this initialized a new tcp variable only here...

    //do this instead...
    tcp = new TcpClient();
    //this will assign a new TcpClient to MainWindow.tcp

所以发生的事情MainWindow.tcp实际上是空的,然后当ReceiveMessages被调用时,你试图调用 GetStream 一个空值。

于 2013-05-16T05:06:54.830 回答