2012-01-04 44 views
0

我試圖在asp.net中使用C#中的套接字。使用套接字在web應用程序中聊天給我一個錯誤

客戶端代碼中的註釋行給我錯誤。

服務器代碼運行正常。

這是給出錯誤的客戶端代碼。

using System; 
using System.Data; 
using System.Configuration; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
using System.Drawing; 
using System.Collections; 
using System.ComponentModel; 
using System.Threading; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 

public partial class _Default : System.Web.UI.Page 
{ 
System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient(); 
NetworkStream serverStream = default(NetworkStream); 
string readData = null; 

protected void Page_Load(object sender, EventArgs e) 
{ 



} 

protected void Post_Click(object sender, EventArgs e) 
{ 
    if (txtmsg.Text != "") 
    { 
     byte[] outStream = System.Text.Encoding.ASCII.GetBytes(txtmsg.Text + "$"); 
     serverStream.Write(outStream, 0, outStream.Length); 
     // This line gives error Saying Object reference not set to an instance of an object. 
     serverStream.Flush(); 
    } 


} 
protected void Connect_Click(object sender, EventArgs e) 
{ 
    if (txtSub.Text != "") 
    { 
     try 
     { 
      readData = "Conected to Chat Server ..."; 
      msg(); 
      clientSocket.Connect("127.0.0.1", 8888); 
      serverStream = clientSocket.GetStream(); 

      byte[] outStream = System.Text.Encoding.ASCII.GetBytes(txtSub.Text + "$"); 
      serverStream.Write(outStream, 0, outStream.Length); 
      serverStream.Flush(); 

      Thread ctThread = new Thread(getMessage); 
      ctThread.Start(); 

     } 
     catch 
     { 
      //Disconnect(); 
     } 
    } 
} 

private void getMessage() 
{ 
    while (true) 
    { 
     serverStream = clientSocket.GetStream(); 
     int buffSize = 0; 
     byte[] inStream = new byte[10025]; 
     buffSize = clientSocket.ReceiveBufferSize; 
     serverStream.Read(inStream, 0, buffSize); 
     string returndata = System.Text.Encoding.ASCII.GetString(inStream); 
     readData = "" + returndata; 
     msg(); 
    } 
} 

private void msg() 
{ 
    //if (this.InvokeRequired) 
    // this.Invoke(new MethodInvoker(msg)); 
    //else 
    txtget.Text = txtget.Text + Environment.NewLine + " >> " + readData; 
} 
} 
+0

你得到什麼錯誤?另外:在頁面生命週期中長時間運行無效。 ASP.NET頁面中的線程通常被認爲是不好的實踐,並不會真正做你想做的事情。請記住:這不是像Windows應用程序一樣永遠運行的代碼。它通常在頁面呈現完成後立即停止(關鍵字頁面生命週期爲asp.net) – Sascha 2012-01-04 07:35:46

+0

您可能想要接受針對您以前提出的問題的一些答案 – 2012-01-04 10:31:09

回答

0

serverSteam對象沒有被正確初始化,因此,當您嘗試引用它會導致一個對象錯誤。

你需要創建一個Socket對象的新NetworkSteam,並確保你的Socket對象連接:

Socket my_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
.. 
// connect socket and any other operations 
.. 
NetworkStream my_network_stream = new NetworkStream(my_socket);