2014-09-27 64 views
1

我正在編寫一個客戶端服務器應用程序,它使用protobuf進行序列化,並使用TCPClient/TCPListener來傳輸數據。protobuf-net關閉tcpclient

該應用程序已被寫入發送一條消息從客戶端到服務器,然後服務器發回響應。然後睡覺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); 
        } 
       }); 
     } 
    } 
} 

回答

0

這是你正在關閉套接字。重組:

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

要:

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

目前,它,它在關閉套接字的第一次迭代中使用塊的結束。