2011-09-26 43 views
0

所以,我很新的這一切的網絡編程,我有幾個問題...在處理Streams時C#中的NullReferenceException?

我建立一個客戶端 - 服務器聊天應用程序,其中,服務器運行,客戶端(S)連接到服務器,然後當客戶端向服務器發送消息時,服務器將其中繼到所有客戶端。該服務器是一個控制檯應用程序,並且該客戶端是一個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_client(一個TcpClient)和chatThread(一個Thread)也是如此。

基本上,問題是,當我運行我的程序並嘗試連接時,它會拋出Exception ex,就好像它無法連接。它拋出一個NullReferenceException與文本:

System.NullReferenceException:對象引用未設置爲對象的實例 。在Chat_Client.Main.btnConnect_Click(對象發件人, 的EventArgs e)在文件路徑\ 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); 
     ... 
+6

哪一個是36行? –

+0

第36行和周圍的一切都會很好。 –

+1

你在'msg()'中做什麼,在第一次調用sw中可能會無效,因爲它在代碼中稍後被初始化? – V4Vendetta

回答

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

在某些時候,你就需要給它比其他null一個值(defaultTcpClientnull)。此外,您可能不需要StreamWriter只發送一個string - 我會看看使用Encoding(以獲取字節;通常爲UTF8)和大小的長度前綴(以字節爲單位)。

3

好吧,這條線是你的問題:

TcpClient sck_client = default(TcpClient); 

明確:

default(TcpClient); 

default()將返回默認值給定類型。如果類型是引用類型(例如類),則它將返回null。如果類型是值類型(例如,int),那麼它將嘗試將其設置爲0

默認關鍵字不會爲您創建類的新實例,您需要使用new關鍵字。

我會認真的讀這個:http://msdn.microsoft.com/en-us/library/fa0ab757.aspx

相關問題