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