简体   繁体   English

protobuf-net关闭tcpclient

[英]protobuf-net closing tcpclient

I am writing a client server application that is using protobuf for serialisation, and a TCPClient / TCPListener for transfering the data. 我正在编写一个使用protobuf进行序列化的客户端服务器应用程序,以及一个用于传输数据的TCPClient / TCPListener的客户端服务器应用程序。

The application has been written to send a message from client to sever, which the sever then sends a response back. 该应用程序已编写为从客户端向服务器发送消息,然后服务器将响应发送回去。 It is then due to sleep for 2 seconds, and repeat. 然后由于睡眠2秒钟,然后重复。

Everything is working fine for the first cycle, but when it tries again the second time, it generates an exception that the socket is closed. 在第一个循环中一切正常,但是在第二次尝试时,它将生成套接字已关闭的异常。

I thought by using SerializeWithLengthPrefix / DeserializeWithLengthPrefix that this kept the socket open? 我认为通过使用SerializeWithLengthPrefix / DeserializeWithLengthPrefix,这可以使套接字保持打开状态?

Full code below: 完整代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using ProtoBuf;
using System.Net;
using System.Threading.Tasks;

namespace SocketServer
{
    [ProtoContract]
    public class Message
    {
        [ProtoMember(1)]
        public string Content { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            StartAcceptor();

            StartClient();

            Console.ReadKey();
        }

        static void StartAcceptor()
        {
            ThreadPool.QueueUserWorkItem(x =>
                {
                    var ipAddress = IPAddress.Parse("127.0.0.1");
                    TcpListener serverSocket = new TcpListener(ipAddress, 8888);
                    serverSocket.Start();
                    Console.WriteLine("Server >> Started");

                    while (true)
                    {
                        var clientSocket = serverSocket.AcceptTcpClient();
                        Console.WriteLine("Server >> Client Connected");
                        StartServerSocket(clientSocket);
                    }
                });
        }

        static void StartServerSocket(TcpClient clientSocket)
        {
            ThreadPool.QueueUserWorkItem(x =>
                {
                    while ((true))
                    {
                        using (NetworkStream networkStream = clientSocket.GetStream())
                        {
                            var message = Serializer.DeserializeWithLengthPrefix<Message>(networkStream, PrefixStyle.Base128);
                            Console.WriteLine(message.Content);

                            message.Content += " Received";
                            Serializer.SerializeWithLengthPrefix(networkStream, message, PrefixStyle.Base128);
                        }
                    }
                });
        }

        static void StartClient()
        {
            ThreadPool.QueueUserWorkItem(x =>
                {
                    var client = new TcpClient();
                    Console.WriteLine("Client >> Started");
                    client.Connect("127.0.0.1", 8888);
                    Console.WriteLine("Client >> Connected To Server");

                    while (true)
                    {
                        NetworkStream serverStream = client.GetStream();

                        var message = new Message();
                        message.Content = "Hello";

                        Serializer.SerializeWithLengthPrefix(serverStream, message, PrefixStyle.Base128);

                        var messager = Serializer.DeserializeWithLengthPrefix<Message>(serverStream, PrefixStyle.Base128);
                        Console.WriteLine(messager.Content);

                        Thread.Sleep(2000);
                    }
                });
        }
    }
}

It is you that is closing the socket. 关闭插座的是您。 Restructure: 重组:

while(...)
    using(...)
        {...}

To: 至:

using(...)
    while(...)
        {...}

At the moment, it it the end of the using block in the first iteration that closes the socket. 目前,关闭套接字的是第一次迭代中using块的结尾。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM