防止套接字自动关闭连接

时间:2018-05-28 01:15:09

标签: c# client-server

所以我正在尝试用C#学习基本的网络通信,我在客户端有这个代码:

    static void Connect(String server, String message)
    {
        try
        {

            Int32 port = 13000;
            TcpClient client = new TcpClient(server, port);
            Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
            NetworkStream stream = client.GetStream();
            stream.Write(data, 0, data.Length);
            data = new Byte[256];
            String responseData = String.Empty;
            Int32 bytes = stream.Read(data, 0, data.Length);
            responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
            Console.WriteLine("Received: {0}", responseData);
            stream.Close();
            client.Close();
        }
        catch (ArgumentNullException e)
        {
            Console.WriteLine("ArgumentNullException: {0}", e);
        }
        catch (SocketException e)
        {
            Console.WriteLine("SocketException: {0}", e);
        }

        Console.WriteLine("\n Press Enter to continue...");
        Console.Read();
    }
    public MainWindow()
    {
        InitializeComponent();
        Connect("127.0.0.1", "something");
    }}

它运行正常,但是我过去几个小时试图做的是解除套接字打开并保持连接发送和接收消息。我想要做的是有一个我将调用的独立函数,它通过套接字连接到服务器,这个连接应该保持打开状态,允许我通过调用其他函数/方法发送请求和接收响应,直到我告诉它关闭。

然而现在发生了什么,如果我试图基本上将这个代码分成两个函数(连接和发送/接收),同时使socket变量全局,是连接工作正常,但当我尝试调用发送/接收函数套接字断开/关闭。 (注意,我没有调用socket.Close())。我确信我错过了一些基本问题,但无法弄清楚我的生活。

编辑:这是我对如何做到这一点的想法:

static TcpClient client;
    static void Connect(String server)
    {
        try
        {

            Int32 port = 13000;
            client = new TcpClient(server, port);

        }
        catch (ArgumentNullException e)
        {
            Console.WriteLine("ArgumentNullException: {0}", e);
        }
        catch (SocketException e)
        {
            Console.WriteLine("SocketException: {0}", e);
        }


    }
    static string sendRec(string message)
    {
        Byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
        NetworkStream stream = client.GetStream();
        stream.Write(data, 0, data.Length);
        data = new Byte[256];
        String responseData = String.Empty;
        Int32 bytes = stream.Read(data, 0, data.Length);
        responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes);
        Console.WriteLine("Received: {0}", responseData);
        return responseData;
    }
    public MainWindow()
    {
        InitializeComponent();
        Connect("127.0.0.1");
        string a = sendRec("test");
    }

但它不起作用。它抛出:System.Reflection.TargetInvocationException:'调用目标抛出了异常。' InnerEx:NullReferenceException:未将对象引用设置为对象的实例。 但我不知道哪个对象是问题,我假设它是套接字。

0 个答案:

没有答案