处理Streams时C#中的NullReferenceException?

时间:2011-09-26 07:05:07

标签: c# networking object nullreferenceexception

所以,我对所有这些网络编程都很陌生,我有几个问题......

我正在构建一个客户端 - 服务器聊天应用程序,其中服务器正在运行,客户端连接到服务器,然后当客户端向服务器发送消息时,服务器将其中继到服务器所有的客户。服务器是控制台应用程序,客户端是Windows窗体应用程序。

我得到的错误是在我的客户端,在我的表单顶部,我有一个文本框,用于接收用户的名称和一个“提交”它的按钮,并使用该用户名连接到服务器。 / p>

无论如何,这是我的按钮连接代码:

    private void btnConnect_Click(object sender, EventArgs e)
    {
        readData = "Connecting to chat server...";
        msg();

        try
        {
            sck_client.Connect("127.0.0.1", 8888);
            sw = new StreamWriter(sck_client.GetStream());
            string toSend = txtUsername.Text;

            sw.Write(toSend);
            sw.Flush();

            chatThread = new Thread(GetMessages);
            chatThread.Start();
        }
        catch (Exception ex)
        {
            readData = ex.ToString(); 
            msg();
        }
    }

msg()非常简单地获取readData中的值并将其打印到屏幕上(在richtextbox中)。 sw是一个在该方法之外公开声明的streamwriter,sck_client(一个TcpClient)和chatThread(一个Thread)也是如此。

基本上,问题是,当我运行我的程序并尝试连接时,它会抛出Exception ex,就好像它无法连接一样。它抛出一个带有文本的NullReferenceException:

  

System.NullReferenceException:未将对象引用设置为实例   一个对象。在Chat_Client.Main.btnConnect_Click(对象发件人,   EventArgs e)在filepath \ Chat_Client \ Main.cs:line36

即使我的服务器正在运行并收听端口8888,也会发生这种情况。那么,我应该怎么做才能修复它?

如果您需要更多我的代码来解决问题,请在评论中告诉我,我会发布。

显示代码实例化的位置:

public partial class Main : Form // new class for the form itself
    {
        // all of these are declared outside any method:
        TcpClient sck_client = default(TcpClient);
        Thread chatThread = default(Thread);
        string readData = null;
        StreamWriter sw = default(StreamWriter);
        StreamReader sr = default(StreamReader);
        ...

2 个答案:

答案 0 :(得分:4)

好的,这行就是你的问题:

TcpClient sck_client = default(TcpClient);

具体是:

default(TcpClient);

default()将返回给定类型的默认值。如果类型是引用类型(例如,类),则它将返回null。如果类型是值类型(例如int),那么它将尝试将其设置为0

默认关键字不会为您创建该类的新实例,您需要使用new关键字。

我会认真地读这个:http://msdn.microsoft.com/en-us/library/fa0ab757.aspx

答案 1 :(得分:3)

TcpClient sck_client = default(TcpClient);
...
sck_client.Connect("127.0.0.1", 8888);

在某些时候,您需要为其提供除null以外的值(default的{​​{1}}为TcpClient)。此外,您可能不需要null只发送StreamWriter - 我会查看使用string(获取字节;通常为UTF8)和长度前缀大小(以字节为单位)。