所以,我对所有这些网络编程都很陌生,我有几个问题......
我正在构建一个客户端 - 服务器聊天应用程序,其中服务器正在运行,客户端连接到服务器,然后当客户端向服务器发送消息时,服务器将其中继到服务器所有的客户。服务器是控制台应用程序,客户端是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);
...
答案 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)和长度前缀大小(以字节为单位)。