首页 文章

protobuf-net关闭tcpclient

提问于
浏览
1

我正在编写一个使用protobuf进行序列化的客户端服务器应用程序,以及一个用于传输数据的TCPClient / TCPListener .

已编写应用程序以从客户端向服务器发送消息,然后服务器发回响应 . 然后由于睡眠2秒,并重复 .

在第一个循环中一切正常,但是当它第二次再次尝试时,它会生成一个异常,即套接字关闭 .

我想通过使用SerializeWithLengthPrefix / DeserializeWithLengthPrefix来保持套接字打开?

完整代码如下:

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);
                    }
                });
        }
    }
}

1 回答

  • 0

    是你关闭套接字 . 重组:

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

    至:

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

    目前,它是第一次迭代中关闭套接字的using块的结束 .

相关问题