空引用异常问题

时间:2015-10-09 06:40:46

标签: c# .net tcp

在下面的代码中,我得到null引用异常我不明白为什么我得到它。请帮我解决一下。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Data.SqlClient;
using System.Configuration;

namespace TCPListener
{
    public partial class Form1 : Form
    {
        // Declare our worker thread
        private Thread workerThread = null;

        public Form1()
        {
            InitializeComponent();
            // Initialise and start worker thread
            this.workerThread = new Thread(new ThreadStart(this.ReceiveTcpData));
            this.workerThread.Start();
        }



        public void timer1_Tick(object sender, EventArgs e)
        {

        }

        public TcpListener server = null;
        public Int32 port = Convert.ToInt32(ConfigurationManager.AppSettings["PUERTO"].ToString());
        public IPAddress localAddr = IPAddress.Parse(ConfigurationManager.AppSettings["IP"].ToString());

        public void OpenSocket()
        {
            try
            {
                // TcpListener server = new TcpListener(port);
                server = new TcpListener(localAddr, port);

                // Start listening for client requests.
                server.Start();
            }
            catch (SocketException e)
            {
                Common.CommonControls.writeToLogFile("SOCKET ERROR: " + e.Message);
            }
            finally
            {
                Common.CommonControls.writeToLogFile("INICIO DE ESCUCHA EN " + DateTime.Now);
            }

        }

        private void ReceiveTcpData()
        {

            //Instancio los objetos
            Entities.Program oPosiciones = new Entities.Program();
            DataAccess.Program oPosicionesDA = new DataAccess.Program();

            try
            {
                // Buffer for reading data
                Byte[] bytes = new Byte[256];
                String data = null;

                // Enter the listening loop.

                // Perform a blocking call to accept requests.
                // You could also user server.AcceptSocket() here.
                //TcpClient client = server.AcceptTcpClient();

                TcpClient cliente = new TcpClient();
                try
                {
                    cliente = server.AcceptTcpClient();
                }
                catch (Exception e) { MessageBox.Show(e.ToString()); }

                data = null;

                // Get a stream object for reading and writing
                NetworkStream stream = cliente.GetStream();

                int i;

                // Loop to receive all the data sent by the client.
                while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                {
                    // Translate data bytes to a ASCII string.
                    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);

                    // Process the data sent by the client.
                    data = data.ToUpper();

                    if (data.Substring(0, 2) == "##")
                    {
                        //SalidaMonitor("Paquete recibido: LOGON REQUEST del equipo");
                        cliente.Close();
                        this.workerThread.Interrupt();
                        return;
                    }

                    byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);

                    //Show data on monitor
                    SalidaMonitor("Paquete recibido " + DateTime.Now + ": " + data);

                    //Declare entities
                    oPosiciones.Paquete = data;

                    //Database action
                    oPosicionesDA.InsertarPosiciones(oPosiciones);

                    // Send back a response.
                    //stream.Write(msg, 0, msg.Length);

                    //SalidaMonitor("Paquete enviado: " + msg);
                }

                // Shutdown and end connection
                cliente.Close();

            }

            catch (SocketException e)
            {
                Common.CommonControls.writeToLogFile("SOCKET ERROR: " + e.Message);
            }
            catch (SqlException x)
            {
                Common.CommonControls.writeToLogFile("SQL ERROR: " + x.Message);
            }
            catch (Exception y)
            {
                Common.CommonControls.writeToLogFile("ERROR: " + y.Message);
            }
            finally
            {
                oPosiciones = null;
                oPosicionesDA = null;
                this.workerThread.Interrupt();

            }
        }

        private void SalidaMonitor(string data)
        {
            lstMensajes.Invoke(new MethodInvoker(delegate { lstMensajes.Items.Add(data.ToString()); }));
            lstMensajes.Invoke(new MethodInvoker(delegate { lstMensajes.SelectedIndex = lstMensajes.Items.Count - 1; lstMensajes.SelectedIndex = -1; }));
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            OpenSocket();
        }
        private void Form1_Close(object sender, FormClosingEventArgs e)
        {
            server.Stop();
        }

    }
}

在上面的代码中,我在 cliente = server.AcceptTcpClient(); 时遇到错误。我不明白为什么会这样。如果您需要任何信息,请告诉我。感谢

2 个答案:

答案 0 :(得分:1)

问题

在您正在创建的表单的构造函数中并启动新的Thread。 并且该线程将调用ReceiveTcpData方法,该用户使用server变量(此时此变量尚未初始化)为什么?

因为server变量在Form_Load中初始化,调用OpenSocket方法以初始化server变量。最重要的部分是Form_Load方法被称为 AFTER 表单的构造函数。 换句话说,线程在初始化之前使用server变量。

解决方案

使用以下构造函数,并删除Form_Load事件处理程序

public Form1()
{
     InitializeComponent();

     // add this line.
     OpenSocket();

     // Initialise and start worker thread
     this.workerThread = new Thread(new ThreadStart(this.ReceiveTcpData));
     this.workerThread.Start();
}

<强>更新

对于喜欢在Form_Load中执行所有操作的人 这是另一种解决方案

public Form1()
{
     InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
     // add this line.
     OpenSocket();

     // Initialise and start worker thread
     this.workerThread = new Thread(new ThreadStart(this.ReceiveTcpData));
     this.workerThread.Start();
}

答案 1 :(得分:0)

好吧,如果它在那一行,那是因为server没有被初始化。