处理流时,C#中的NullReferenceException?

处理流时,C#中的NullReferenceException?,c#,networking,object,nullreferenceexception,C#,Networking,Object,Nullreferenceexception,所以,我对所有这些网络编程都很陌生,我有几个问题 我正在构建一个客户机-服务器聊天应用程序,其中服务器正在运行,客户机连接到服务器,然后当客户机向服务器发送消息时,服务器将消息转发给所有客户机。服务器是一个控制台应用程序,客户端是一个Windows窗体应用程序 我遇到的错误是在我的客户机中,在我表单的最顶端,我有一个文本框,用于输入用户名,还有一个按钮用于“提交”用户名并使用该用户名连接到服务器 无论如何,这是我的按钮连接代码: private void btnConnect_Click

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

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

我遇到的错误是在我的客户机中,在我表单的最顶端,我有一个文本框,用于输入用户名,还有一个按钮用于“提交”用户名并使用该用户名连接到服务器

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

    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_客户端(TcpClient)和chatThread(线程)也是

基本上,问题是,当我运行我的程序并尝试连接时,它抛出异常ex,就好像它无法连接一样。它抛出一个包含以下文本的NullReferenceException:

System.NullReferenceException:对象引用未设置为实例 指一个物体。在Chat_Client.Main.btnConnect_中,单击(对象发送者, EventArgs e)在filepath\Chat\u 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);
        ...
在某些情况下,您需要给它一个非
null
(TcpClient的
默认值为
null
)。此外,您可能不需要一个
StreamWriter
来发送
字符串
——我会考虑使用
编码(获取字节;通常是UTF8)和大小的长度前缀(以字节为单位)


在某些情况下,您需要给它一个非
null
(TcpClient
默认值为
null
)。此外,您可能不需要一个
StreamWriter
来发送
字符串
——我会考虑使用
编码(获取字节;通常是UTF8)和大小的长度前缀(以字节为单位)。

好的,这一行是您的问题:

TcpClient sck_client = default(TcpClient);
具体而言:

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

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


我会认真阅读这篇文章:

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

TcpClient sck_client = default(TcpClient);
具体而言:

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

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


我会认真阅读这篇文章:

哪一行是第36行?第36行和它周围的一切都会很好。你在
msg()
中做什么,在第一次调用中,sw可能无效,因为它在代码中稍后初始化?第36行是我尝试连接套接字的地方(我已经发布的代码中的第8行):“sck_client.connect”(“127.0.0.1", 8888);“---------msg(),正如我前面提到的,只是更新富文本框(我正在使用它来显示新消息),这只是一个简单的追加文本的问题,大部分来自readData字符串。您是否能够了解我们,关于所示代码,
sck_client
在哪里实例化?哪一个是第36行?第36行及其周围的一切都很好。您在
msg()中做什么
,在第一次调用中,sw可能无效,因为它在代码中稍后初始化?第36行是我尝试连接套接字的地方(我已经发布的代码中的第8行):“sck_client.connect”(“127.0.0.1”,8888);“---------msg(),正如我前面提到的,只是简单地更新富文本框(我正在使用它来显示新消息),这只是一个附加文本的问题,主要来自readData字符串。您能告诉我们,与显示的代码相关,
sck_client
在哪里被实例化吗?”?