试图在WPF中创建一个基本的TCP客户端

时间:2013-05-16 05:03:23

标签: c# wpf tcp

我正在尝试在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);
    }
}

}

运行它会在Receive messages方法中出错。它说错误是“SrReciever = new StreamReader(tcp.GetStream());”说它是NullReferenceException,对象引用没有设置为对象的实例。

我不是编程方面最好的,所以如果有一个在WPF中工作的TCP客户端的例子,那将非常有用。

由于 尼克

1 个答案:

答案 0 :(得分:3)

这只是因为你在这里创建了一个范围变量:

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称为空值。